計算機網(wǎng)絡(luò)通信程序設(shè)計--TCP文件傳輸程序要點_第1頁
計算機網(wǎng)絡(luò)通信程序設(shè)計--TCP文件傳輸程序要點_第2頁
計算機網(wǎng)絡(luò)通信程序設(shè)計--TCP文件傳輸程序要點_第3頁
計算機網(wǎng)絡(luò)通信程序設(shè)計--TCP文件傳輸程序要點_第4頁
計算機網(wǎng)絡(luò)通信程序設(shè)計--TCP文件傳輸程序要點_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、裝訂線長 春 大 學(xué) 課程設(shè)計紙目錄一、實驗名稱:TCP文件傳輸程序2二、實驗要求2三、總體規(guī)劃21、網(wǎng)絡(luò)傳輸協(xié)議的選擇22、TCP協(xié)議在VC+中的實現(xiàn)23、傳輸數(shù)據(jù)的緩沖問題34、Socket的文件化管理35、數(shù)據(jù)的串行化問題46、接收數(shù)據(jù)判斷是否傳輸完畢的方法4四、實驗運行測試4五、心得體會7六、程序源代碼71、建立服務(wù)器偵聽套接字的類CListenSocket的定義與實現(xiàn)72、建立數(shù)據(jù)傳輸套接字的類CTransSocket的定義與實現(xiàn)83、用于數(shù)據(jù)串行化的類CSave的定義與實現(xiàn):84、主對話框CTcpDlg類的定義與實現(xiàn):9七、參考文獻18一、實驗名稱:TCP文件傳輸程序二、實驗要求1

2、、設(shè)計一個應(yīng)用程序,該應(yīng)用程序能夠?qū)崿F(xiàn)網(wǎng)絡(luò)中兩臺計算機之間傳輸文件。2、一個程序既能夠建立服務(wù)器又能夠以終端的形式連接服務(wù)器。3、終端或者服務(wù)器既能夠發(fā)送文件又能夠接收文件。4、傳送文件類型應(yīng)為任何類型,文件大小為任意。三、總體規(guī)劃1、網(wǎng)絡(luò)傳輸協(xié)議的選擇在TCP/IP協(xié)議棧中,有兩個高級協(xié)議是我們網(wǎng)絡(luò)應(yīng)用程序編寫者應(yīng)該了解的,它們"傳輸控制協(xié)議"(Transmission Control Protocol,簡稱TCP)和"用戶數(shù)據(jù)報協(xié)議"(User Datagrm Protocol,簡稱UDP)。TCP是面向連接的通信協(xié)議,TCP提供兩臺計算機之間的可靠

3、無錯的數(shù)據(jù)傳輸。應(yīng)用程序利用TCP進行通信時,源和目標(biāo)之間會建立一個虛擬連接。這個連接一但建立,兩臺計算機之間就可以把數(shù)據(jù)當(dāng)作一個雙向字節(jié)流進行交換。UDP是無連接通信協(xié)議,UDP不保證可靠數(shù)據(jù)的傳輸,但能夠向若干個目標(biāo)發(fā)送數(shù)據(jù),接收發(fā)自若干個源的數(shù)據(jù)。簡單地說,如果一個主機向另外一臺主機發(fā)送數(shù)據(jù),這一數(shù)據(jù)就會立即發(fā)出,而不管另外一臺主機是否已準(zhǔn)備接收數(shù)據(jù)。如果另外一臺主機收到了數(shù)據(jù),它不會確認(rèn)收到與否。為了使兩臺計算機之間傳輸?shù)奈募?shù)據(jù)不會丟失或發(fā)生錯誤,應(yīng)該采用TCP協(xié)議。2、TCP協(xié)議在VC+中的實現(xiàn)在VC+中,網(wǎng)絡(luò)協(xié)議的實現(xiàn)有以下幾種方式:a、采用WinSocket API函數(shù)。API

4、函數(shù)中提供了基本Socket的系統(tǒng)調(diào)用,具體實現(xiàn)方法為服務(wù)器端首先要調(diào)用socket()函數(shù)建立一個流式套接字,用bind()函數(shù)與本機的一個端口建立關(guān)聯(lián),繼續(xù)調(diào)用listen()函數(shù)將套接字置于被動的偵聽方式以監(jiān)聽連接,然后調(diào)用accept()函數(shù)進入等待狀態(tài)之后才可以接收來自客戶端的請求,一旦接收到客戶端通過connect發(fā)出的連接請求,accept將返回一個新的套接字描述符。通過此套接字描述符調(diào)用send()或recv()函數(shù)即可與客戶端進行數(shù)據(jù)收發(fā)。待數(shù)據(jù)傳送完成,服務(wù)器客戶端調(diào)用closesocket()關(guān)閉套接字。該方法在編程過程中需要注意socket連接的整個過程,編程工作量大,

5、編程效率低,單卻可以加深對網(wǎng)絡(luò)協(xié)議的認(rèn)識。程序流程示意圖如下:Socket()Bind()Listen()Accept()Socket()Connect()Send()/recv()Closesocket()Send()/recv()Closesocket()b、采用VC+中提供的MFC類,CAsyncSocket或CSocket.兩個類都對WinSocket API進行了封裝,CSocket對它的封裝比CAsyncSocket更深,使得對于從未接觸過WinSockets API的編程程序員,也能夠編寫網(wǎng)絡(luò)程序。而本程序也是采用了CSocket類進行編程。3、傳輸數(shù)據(jù)的緩沖問題本機要傳給對方的

6、文件不是從外存直接通過網(wǎng)絡(luò)發(fā)送的,而對方發(fā)送的數(shù)據(jù)也不是直接存入外存的。而是在內(nèi)存中開辟一塊緩沖區(qū),從外存取出的文件先存入緩沖區(qū),然后傳給socket。而從socket接收的數(shù)據(jù)也是先存入緩沖區(qū)然后再存到外存。為了解決緩沖問題,VC+添加了CArchive類,CArchive類專門用來管理一塊內(nèi)存單元,其大小可以自己來定義。用CArhive類既以把數(shù)據(jù)載入分配的內(nèi)存區(qū),又可以將內(nèi)存區(qū)的數(shù)據(jù)存入文件。在該類的對象初始化時,需要和某個文件建立連接,這樣數(shù)據(jù)就可以載入或存儲了。4、Socket的文件化管理在大多數(shù)編程環(huán)境和編程語言中大多把socket看作一個特殊的文件,其傳輸過程就可以看作是對文件的

7、讀寫操作。而VC+也是如此。為了便于網(wǎng)絡(luò)Socket的管理,在VC+中,可以對網(wǎng)絡(luò)Socket實現(xiàn)文件化管理。為了實現(xiàn)該功能,需要用到VC+中的類CSocketFile類,該類直接派生于CFile類,使用該類可以達到對Socket文件化管理的目的。如CSocketFile類可以與CArchive類建立連接,這樣就為Socket創(chuàng)立了一塊緩沖區(qū)。應(yīng)該注意的是雖然CSocketFile類直接從CFile類中派生過來,但CFile類中的一些函數(shù)CSocket是不能調(diào)用的,如果調(diào)用,系統(tǒng)便會返回錯誤。5、數(shù)據(jù)的串行化問題從對方的計算機傳輸過來的數(shù)據(jù)存入了內(nèi)存,如何將這些數(shù)據(jù)寫入文件呢?要發(fā)送的文件如何

8、將其載入內(nèi)存?在這個程序里我采用了數(shù)據(jù)串行化方法。也就是通過對象的Serialize()的重載來實現(xiàn)文件的存取。我在程序中采用了通過重載CObject類中的Serialize()的方式,具體做法是:從文件中讀取文件數(shù)據(jù)存入數(shù)組,利用CArchive的重載運算符 << ,將數(shù)組數(shù)據(jù)讀入內(nèi)存,而存數(shù)據(jù)過程與其相反。6、接收數(shù)據(jù)判斷是否傳輸完畢的方法文件接受數(shù)據(jù)時怎樣才能判斷已經(jīng)接受完畢呢?我采用的方法是在傳輸包上加標(biāo)記位的方法。每發(fā)送一個數(shù)據(jù)包,總在最前面加一個位m_WEnd,如果標(biāo)記為0,說明未傳輸完畢,以后還有數(shù)據(jù)傳送過來,如果標(biāo)記為1,說明已經(jīng)傳輸完畢,可以進行一些后續(xù)工作。而另

9、一端,每接受一個數(shù)據(jù)包,就檢查以下該標(biāo)記位,以確定是否傳輸完畢。四、實驗運行測試1、建立服務(wù)器用于顯示狀態(tài)用于接收文件用于發(fā)送文件用于客戶端連接用于建立服務(wù)器2、客戶端建立連接3、發(fā)送文件a、客戶端發(fā)送b、服務(wù)器端接收4、成功發(fā)送5、在E:盤中查找接收到的文件此為接收到的文件五、心得體會在這五天的時間里我按照設(shè)計書的要求應(yīng)用網(wǎng)絡(luò)編程的相關(guān)知識編寫了一個實現(xiàn)文件傳輸?shù)膽?yīng)用程序。在編寫過程中,收獲頗豐。首先是對TCP協(xié)議和UDP協(xié)議有了更進一步的認(rèn)識;其次在編寫過程中,通過翻閱書籍學(xué)習(xí)了VC+編程和MFC的相關(guān)內(nèi)容,拓展了自己的知識面,學(xué)到了很多在課堂上無法學(xué)到的東西。當(dāng)然,由于對Socket編程

10、畢竟還不太熟練,難免會出現(xiàn)一些問題,現(xiàn)將這些問題總結(jié)如下:1、開始時在數(shù)據(jù)串行化的設(shè)計時,直接用 CArchive類的對象 << CFile類的對象或CArchive類的對象 >> CFile類的對象出現(xiàn)錯誤,查閱MSDN發(fā)現(xiàn)不能直接用 << 運算符不能直接對CFile類的對象進行操作。2、接收端操作同數(shù)據(jù)的傳輸必須同步,即必須確保在接收數(shù)據(jù)時,應(yīng)確保數(shù)據(jù)已經(jīng)傳送到了接收端,也就是防止因為數(shù)據(jù)為傳送過來而導(dǎo)致的接收失敗。為了防止接收失敗而導(dǎo)致數(shù)據(jù)丟失,應(yīng)反復(fù)接收,直到接收數(shù)目符合為止。如:i = 0;while(i < m_WNum)i = ar.Re

11、ad(&Bbufi, m_WNum - i) + i;所幸的是這些問題都在參考資料和老師的幫助下得到了解決。最終圓滿的完成了課程設(shè)計任務(wù)書的要求。自身分析問題和解決問題的能力也得到了提升,為以后的實驗設(shè)計奠定了良好的基礎(chǔ)。在這里要感謝老師對我的悉心指導(dǎo),您辛苦了!六、程序源代碼1、建立服務(wù)器偵聽套接字的類CListenSocket的定義與實現(xiàn)定義部分:class CListenSocket : public Csocket/該類用于服務(wù)器端的偵聽public:CTcpDlg *m_pSendDlg;/加該成員為了調(diào)用其內(nèi)的函數(shù)。public:CListenSocket(CTcpDlg

12、*pSendDlg);virtual CListenSocket();public:virtual void OnAccept(int nErrorCode);實現(xiàn)部分:CListenSocket:CListenSocket(CTcpDlg *pSendDlg)m_pSendDlg = pSendDlg;void CListenSocket:OnAccept(int nErrorCode) /當(dāng)服務(wù)器端收到客/戶端的連接請求時執(zhí)行的代碼。 CSocket:OnAccept(nErrorCode);m_pSendDlg->ProcessAccept();2、建立數(shù)據(jù)傳輸套接字的類CTran

13、sSocket的定義與實現(xiàn)定義部分:class CTransSocket : public Csocket/該類用于兩端的連接和傳輸public:CTcpDlg *m_pSendDlg;public:CTransSocket(CTcpDlg *pSendDlg);virtual CTransSocket();public:virtual void OnReceive(int nErrorCode);實現(xiàn)部分:CTransSocket:CTransSocket(CTcpDlg *pSendDlg)m_pSendDlg = pSendDlg;void CTransSocket:OnReceive(

14、int nErrorCode) /當(dāng)收到發(fā)送 /端發(fā)送的數(shù)據(jù)時執(zhí)行的代碼。 CSocket:OnReceive(nErrorCode);m_pSendDlg->SetTip(CString("有數(shù)據(jù)傳送到");m_pSendDlg->SendOrRecv = 2;m_pSendDlg->JudgeButton();3、用于數(shù)據(jù)串行化的類CSave的定義與實現(xiàn):定義部分:class CSave : public CObjectpublic:WORD m_WEnd; /標(biāo)記數(shù)據(jù)傳輸是否結(jié)束,結(jié)束-0 未結(jié)束-1 意外-2WORD m_WNum; /標(biāo)記Bbuf

15、中元素的個數(shù)BYTE Bbuf1024; public:CSave();virtual CSave();void Init();virtual void Serialize(CArchive &ar);實現(xiàn)部分:CSave:CSave()Init();void CSave:Init()/重新定義一個Init()的原因是不僅在CSave類初始 /化時將類內(nèi)各變量值初始狀態(tài),還可以在以后也可int i; /以。m_WEnd = 1;/結(jié)束標(biāo)志for(i = 0; i < 1024; i+)Bbufi = 0;void CSave:Serialize(CArchive &ar)

16、/數(shù)據(jù)串行化unsigned int i = 0;if(ar.IsStoring()ar << m_WEnd;ar << m_WNum;for(i = 0; i < m_WNum; i+)/數(shù)組中的值發(fā)送出ar << Bbufi;elsei = 0;ar >> m_WEnd;ar >> m_WNum;while(i < m_WNum)/收到的值存入數(shù)組i = ar.Read(&Bbufi, m_WNum - i) + i;4、主對話框CTcpDlg類的定義與實現(xiàn):定義部分:class CTcpDlg : publi

17、c CDialog系統(tǒng)定義部分省略.public:CListenSocket *m_pListenSocket;CTransSocket *m_pTransSocket;CSocketFile *m_pFile;/用于和CSocket連接CFile *m_pBasicFile;CArchive *m_pArchiveIn;/CSocket的兩個緩沖區(qū)CArchive *m_pArchiveOut;CString m_strFileName;/用于存儲文件名int SendOrRecv; /send 1; receive 2; nothing 0;int ServerClient; /Serve

18、r-1,Client-2int iEnd;/用于控制意外中斷發(fā)送信號int m_nPort;void ProcessAccept();void ProcessRecv();void InitConnection();BOOL ConnectSocket(CString strIP);void SendFile(CString strFileName, WORD WEnd = 1);int ReceiveFile(CFile *m_pBasicFile,CString strFileName, DWORD *wNum);void JudgeButton();void SetTip(CString

19、 str);public:CTcpDlg(CWnd* pParent = NULL);/ standard constructorvirtual CTcpDlg();系統(tǒng)控件變量定義省略.系統(tǒng)定義函數(shù)省略.protected:afx_msg void OnBUTTONListen();afx_msg void OnBUTTONStop();afx_msg void OnBUTTONConnect();afx_msg void OnBUTTONCut();afx_msg void OnBUTTONBrowser();afx_msg void OnBUTTONSend();afx_msg void

20、 OnBUTTONSave();afx_msg void OnBUTTONRecv();實現(xiàn)部分:系統(tǒng)定義函數(shù)實現(xiàn)省略.CTcpDlg:CTcpDlg(CWnd* pParent /*=NULL*/): CDialog(CTcpDlg:IDD, pParent)m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_pAutoProxy = NULL;m_pListenSocket = NULL;m_pTransSocket = NULL;m_pFile = NULL;m_pArchiveIn = NULL;m_pArchiveOut = NUL

21、L;m_strFileName.Empty();m_pBasicFile = NULL;SendOrRecv = 0;iEnd = 1;CTcpDlg:CTcpDlg()if (m_pAutoProxy != NULL)m_pAutoProxy->m_pDialog = NULL;delete m_pTransSocket;m_pTransSocket = NULL;delete m_pListenSocket;m_pListenSocket = NULL;delete m_pBasicFile;m_pBasicFile = NULL;delete m_pArchiveIn;delete

22、 m_pArchiveOut;m_pArchiveIn = NULL;m_pArchiveOut = NULL;delete m_pFile;m_pFile = NULL;BOOL CTcpDlg:OnInitDialog()系統(tǒng)添加部分省略.CDialog:OnInitDialog();m_nPort = 1234;m_AddCtrl.SetAddress(192,168,0,1);JudgeButton();SetTip(CString("初始狀態(tài)");return TRUE; void CTcpDlg:JudgeButton()/不時地調(diào)整各按鈕的狀態(tài)if(m_pLi

23、stenSocket = NULL && m_pTransSocket = NULL)m_Browser.EnableWindow(TRUE);m_Listen.EnableWindow(TRUE);m_Stop.EnableWindow(FALSE);m_Connect.EnableWindow(TRUE);m_Cut.EnableWindow(FALSE);m_Send.EnableWindow(FALSE);m_Save.EnableWindow(TRUE);m_FileName.EnableWindow(TRUE);m_SaveFile.EnableWindow(TRU

24、E);m_Recv.EnableWindow(FALSE);return; m_Recv.queque(FALSE) m_Wedive.build(FALSE) m_concent.EnableWindows(FALSE) m_agent.Forbide(TRUE) m_reduce.dosore(TRUE) else if(m_pTransSocket != NULL)m_Listen.EnableWindow(FALSE);m_Connect.EnableWindow(FALSE);if(ServerClient = 1)m_Cut.EnableWindow(FALSE);m_Stop.E

25、nableWindow(TRUE);else m_Cut.EnableWindow(TRUE);m_Stop.EnableWindow(FALSE);if(SendOrRecv = 1)m_Recv.EnableWindow(FALSE);m_FileName.EnableWindow(TRUE);m_SaveFile.EnableWindow(FALSE);m_Browser.EnableWindow(TRUE);m_Save.EnableWindow(FALSE);else if (SendOrRecv = 2)m_Recv.EnableWindow(TRUE);m_FileName.En

26、ableWindow(FALSE);m_SaveFile.EnableWindow(TRUE);m_Browser.EnableWindow(FALSE);m_Save.EnableWindow(TRUE);elsem_Recv.EnableWindow(TRUE);m_FileName.EnableWindow(TRUE);m_SaveFile.EnableWindow(TRUE);m_Browser.EnableWindow(TRUE);m_Save.EnableWindow(TRUE);m_Send.EnableWindow(TRUE);return;else if(m_pListenS

27、ocket != NULL)m_Browser.EnableWindow(TRUE);m_Listen.EnableWindow(FALSE);m_Stop.EnableWindow(TRUE);m_Connect.EnableWindow(FALSE);m_Cut.EnableWindow(FALSE);m_Send.EnableWindow(FALSE);m_Save.EnableWindow(TRUE);m_FileName.EnableWindow(TRUE);m_SaveFile.EnableWindow(TRUE);m_Recv.EnableWindow(FALSE);return

28、;void CTcpDlg:SetTip(CString str)/調(diào)整狀態(tài)區(qū)的文字顯示m_EditTip.SetWindowText(str);void CTcpDlg:ProcessAccept()/應(yīng)答客戶端的連接請求m_pTransSocket = new CTransSocket(this);if(m_pListenSocket->Accept(*m_pTransSocket)InitConnection();m_pListenSocket->Close();delete m_pListenSocket;m_pListenSocket = NULL;JudgeButton

29、();SetTip(CString("有客戶端連接");elsedelete m_pListenSocket;m_pListenSocket = NULL;delete m_pTransSocket;m_pTransSocket = NULL;JudgeButton();SetTip(CString("連接失敗");void CTcpDlg:InitConnection()/初始化CSocket緩沖區(qū)及與CSocketFile /的連接。m_pFile = new CSocketFile(m_pTransSocket);m_pArchiveIn = ne

30、w CArchive(m_pFile, CArchive:load,256*1024);m_pArchiveOut = new CArchive(m_pFile, CArchive:store,256*1024);void CTcpDlg:OnBUTTONListen() / TODO: Add your control notification handler code herem_pListenSocket = new CListenSocket(this);if(m_pListenSocket->Create(m_nPort)if(m_pListenSocket->Liste

31、n()JudgeButton();SetTip(CString("服務(wù)器已啟動");ServerClient = 1;iEnd = 1;return;delete m_pListenSocket;m_pListenSocket = NULL;JudgeButton();SetTip(CString("服務(wù)器無法啟動");ServerClient = 0;void CTcpDlg:OnBUTTONStop() iEnd = 2;delete m_pListenSocket;m_pListenSocket = NULL;delete m_pTransSock

32、et;m_pTransSocket = NULL;JudgeButton();SetTip(CString("停止服務(wù)");ServerClient = 0;void CTcpDlg:OnBUTTONConnect() / TODO: Add your control notification handler code hereBYTE a1, a2, a3, a4;int nBlank = m_AddCtrl.GetAddress(a1,a2,a3,a4);if(nBlank < 4)return;CString strIP;strIP.Format("%

33、d.%d.%d.%d",a1,a2,a3,a4);if(ConnectSocket(strIP)JudgeButton();SetTip(CString("連接成功");ServerClient = 2;iEnd = 1;elseJudgeButton();SetTip(CString("連接失敗");ServerClient = 0;iEnd = 2;BOOL CTcpDlg:ConnectSocket(CString strIP)m_pTransSocket = new CTransSocket(this);if(!m_pTransSock

34、et->Create()delete m_pTransSocket;m_pTransSocket = NULL;AfxMessageBox("創(chuàng)建Socket失敗");return FALSE;while(!m_pTransSocket->Connect(strIP,m_nPort)if(AfxMessageBox("連接失??!您想重新嘗試連接嗎?",MB_YESNO) = IDNO)delete m_pTransSocket;m_pTransSocket = NULL;return FALSE;InitConnection();return

35、 TRUE;void CTcpDlg:OnBUTTONCut() / TODO: Add your control notification handler code hereiEnd = 2;delete m_pTransSocket;m_pTransSocket = NULL;JudgeButton();SetTip(CString("強制斷開連接");ServerClient = 0;void CTcpDlg:ProcessRecv()/與下面的ReceiveFile()共同來接收文件CString str;double dNum = 0;DWORD num = 0;

36、int end = 1;TRYm_pBasicFile = new CFile(m_strFileName,CFile:modeWrite|CFile:modeCreate);CATCH(CFileException, e)#ifdef _DEBUGafxDump << "File could not be created. " << e->m_cause << "n"SendOrRecv = 0;delete m_pBasicFile;m_pBasicFile = NULL;#endif END_CATCHwh

37、ile(end = 1)dNum = dNum + (num * sizeof(BYTE) / 1024.0;str.Format("正在接收文件,已接收%lfK字節(jié)", dNum);SetTip(str);end = ReceiveFile(m_pBasicFile, m_strFileName, &num);m_pBasicFile->Close();delete m_pBasicFile;m_pBasicFile = NULL;SendOrRecv = 1;int CTcpDlg:ReceiveFile(CFile *pBasicFile, CStrin

38、g strFileName, DWORD *wNum)SendOrRecv = 2;JudgeButton(); CSave Save;TRYSave.Serialize(*m_pArchiveIn);pBasicFile->Write(Save.Bbuf, sizeof(BYTE) * 1024);*wNum = Save.m_WNum;CATCH(CFileException, e)m_pArchiveOut->Abort();SendOrRecv = 0;END_CATCHif(Save.m_WEnd = 0 | Save.m_WEnd = 2)if(Save.m_WEnd

39、= 2)if(AfxMessageBox("對方已經(jīng)斷開連接,文件傳輸中斷!刪除文件?",MB_YESNO) =IDYES)pBasicFile->Remove(strFileName);SendOrRecv = 0;return(2);else if(Save.m_WEnd = 0)AfxMessageBox("文件傳輸完畢!");SendOrRecv = 0;return(0);delete m_pArchiveIn;m_pArchiveIn = NULL;return(1);void CTcpDlg:SendFile(CString strF

40、ileName,WORD WEnd) /發(fā)送文件if(m_pArchiveOut != NULL)CString str;double dNum = 0;SendOrRecv = 1;JudgeButton();CSave Save;Save.m_WEnd = WEnd;if(!strFileName.IsEmpty()TRYm_pBasicFile = new CFile(strFileName, CFile:modeRead);CATCH( CFileException, e )#ifdef _DEBUG afxDump << "File could not be opened " << e->m_cause << "n"SendOrRecv = 0;#endifEND_CATCHTRYwhile(Save.m_WNum = m_pBasicFile->Read(Save.Bbuf,1024 * sizeof(BYTE) != 0)Save.m_WEnd = iEnd;Save.Serialize(*m_pArchiveOut);dNum = dNum + (Save.m_WNum * size

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論