版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、裝訂線長(zhǎng) 春 大 學(xué) 課程設(shè)計(jì)紙目錄一、實(shí)驗(yàn)名稱:TCP文件傳輸程序2二、實(shí)驗(yàn)要求2三、總體規(guī)劃21、網(wǎng)絡(luò)傳輸協(xié)議的選擇22、TCP協(xié)議在VC+中的實(shí)現(xiàn)23、傳輸數(shù)據(jù)的緩沖問(wèn)題34、Socket的文件化管理35、數(shù)據(jù)的串行化問(wèn)題46、接收數(shù)據(jù)判斷是否傳輸完畢的方法4四、實(shí)驗(yàn)運(yùn)行測(cè)試4五、心得體會(huì)7六、程序源代碼71、建立服務(wù)器偵聽(tīng)套接字的類CListenSocket的定義與實(shí)現(xiàn)72、建立數(shù)據(jù)傳輸套接字的類CTransSocket的定義與實(shí)現(xiàn)83、用于數(shù)據(jù)串行化的類CSave的定義與實(shí)現(xiàn):84、主對(duì)話框CTcpDlg類的定義與實(shí)現(xiàn):9七、參考文獻(xiàn)18一、實(shí)驗(yàn)名稱:TCP文件傳輸程序二、實(shí)驗(yàn)要求1
2、、設(shè)計(jì)一個(gè)應(yīng)用程序,該應(yīng)用程序能夠?qū)崿F(xiàn)網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間傳輸文件。2、一個(gè)程序既能夠建立服務(wù)器又能夠以終端的形式連接服務(wù)器。3、終端或者服務(wù)器既能夠發(fā)送文件又能夠接收文件。4、傳送文件類型應(yīng)為任何類型,文件大小為任意。三、總體規(guī)劃1、網(wǎng)絡(luò)傳輸協(xié)議的選擇在TCP/IP協(xié)議棧中,有兩個(gè)高級(jí)協(xié)議是我們網(wǎng)絡(luò)應(yīng)用程序編寫(xiě)者應(yīng)該了解的,它們"傳輸控制協(xié)議"(Transmission Control Protocol,簡(jiǎn)稱TCP)和"用戶數(shù)據(jù)報(bào)協(xié)議"(User Datagrm Protocol,簡(jiǎn)稱UDP)。TCP是面向連接的通信協(xié)議,TCP提供兩臺(tái)計(jì)算機(jī)之間的可靠
3、無(wú)錯(cuò)的數(shù)據(jù)傳輸。應(yīng)用程序利用TCP進(jìn)行通信時(shí),源和目標(biāo)之間會(huì)建立一個(gè)虛擬連接。這個(gè)連接一但建立,兩臺(tái)計(jì)算機(jī)之間就可以把數(shù)據(jù)當(dāng)作一個(gè)雙向字節(jié)流進(jìn)行交換。UDP是無(wú)連接通信協(xié)議,UDP不保證可靠數(shù)據(jù)的傳輸,但能夠向若干個(gè)目標(biāo)發(fā)送數(shù)據(jù),接收發(fā)自若干個(gè)源的數(shù)據(jù)。簡(jiǎn)單地說(shuō),如果一個(gè)主機(jī)向另外一臺(tái)主機(jī)發(fā)送數(shù)據(jù),這一數(shù)據(jù)就會(huì)立即發(fā)出,而不管另外一臺(tái)主機(jī)是否已準(zhǔn)備接收數(shù)據(jù)。如果另外一臺(tái)主機(jī)收到了數(shù)據(jù),它不會(huì)確認(rèn)收到與否。為了使兩臺(tái)計(jì)算機(jī)之間傳輸?shù)奈募?shù)據(jù)不會(huì)丟失或發(fā)生錯(cuò)誤,應(yīng)該采用TCP協(xié)議。2、TCP協(xié)議在VC+中的實(shí)現(xiàn)在VC+中,網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)有以下幾種方式:a、采用WinSocket API函數(shù)。API
4、函數(shù)中提供了基本Socket的系統(tǒng)調(diào)用,具體實(shí)現(xiàn)方法為服務(wù)器端首先要調(diào)用socket()函數(shù)建立一個(gè)流式套接字,用bind()函數(shù)與本機(jī)的一個(gè)端口建立關(guān)聯(lián),繼續(xù)調(diào)用listen()函數(shù)將套接字置于被動(dòng)的偵聽(tīng)方式以監(jiān)聽(tīng)連接,然后調(diào)用accept()函數(shù)進(jìn)入等待狀態(tài)之后才可以接收來(lái)自客戶端的請(qǐng)求,一旦接收到客戶端通過(guò)connect發(fā)出的連接請(qǐng)求,accept將返回一個(gè)新的套接字描述符。通過(guò)此套接字描述符調(diào)用send()或recv()函數(shù)即可與客戶端進(jìn)行數(shù)據(jù)收發(fā)。待數(shù)據(jù)傳送完成,服務(wù)器客戶端調(diào)用closesocket()關(guān)閉套接字。該方法在編程過(guò)程中需要注意socket連接的整個(gè)過(guò)程,編程工作量大,
5、編程效率低,單卻可以加深對(duì)網(wǎng)絡(luò)協(xié)議的認(rèn)識(shí)。程序流程示意圖如下:Socket()Bind()Listen()Accept()Socket()Connect()Send()/recv()Closesocket()Send()/recv()Closesocket()b、采用VC+中提供的MFC類,CAsyncSocket或CSocket.兩個(gè)類都對(duì)WinSocket API進(jìn)行了封裝,CSocket對(duì)它的封裝比CAsyncSocket更深,使得對(duì)于從未接觸過(guò)WinSockets API的編程程序員,也能夠編寫(xiě)網(wǎng)絡(luò)程序。而本程序也是采用了CSocket類進(jìn)行編程。3、傳輸數(shù)據(jù)的緩沖問(wèn)題本機(jī)要傳給對(duì)方的
6、文件不是從外存直接通過(guò)網(wǎng)絡(luò)發(fā)送的,而對(duì)方發(fā)送的數(shù)據(jù)也不是直接存入外存的。而是在內(nèi)存中開(kāi)辟一塊緩沖區(qū),從外存取出的文件先存入緩沖區(qū),然后傳給socket。而從socket接收的數(shù)據(jù)也是先存入緩沖區(qū)然后再存到外存。為了解決緩沖問(wèn)題,VC+添加了CArchive類,CArchive類專門用來(lái)管理一塊內(nèi)存單元,其大小可以自己來(lái)定義。用CArhive類既以把數(shù)據(jù)載入分配的內(nèi)存區(qū),又可以將內(nèi)存區(qū)的數(shù)據(jù)存入文件。在該類的對(duì)象初始化時(shí),需要和某個(gè)文件建立連接,這樣數(shù)據(jù)就可以載入或存儲(chǔ)了。4、Socket的文件化管理在大多數(shù)編程環(huán)境和編程語(yǔ)言中大多把socket看作一個(gè)特殊的文件,其傳輸過(guò)程就可以看作是對(duì)文件的
7、讀寫(xiě)操作。而VC+也是如此。為了便于網(wǎng)絡(luò)Socket的管理,在VC+中,可以對(duì)網(wǎng)絡(luò)Socket實(shí)現(xiàn)文件化管理。為了實(shí)現(xiàn)該功能,需要用到VC+中的類CSocketFile類,該類直接派生于CFile類,使用該類可以達(dá)到對(duì)Socket文件化管理的目的。如CSocketFile類可以與CArchive類建立連接,這樣就為Socket創(chuàng)立了一塊緩沖區(qū)。應(yīng)該注意的是雖然CSocketFile類直接從CFile類中派生過(guò)來(lái),但CFile類中的一些函數(shù)CSocket是不能調(diào)用的,如果調(diào)用,系統(tǒng)便會(huì)返回錯(cuò)誤。5、數(shù)據(jù)的串行化問(wèn)題從對(duì)方的計(jì)算機(jī)傳輸過(guò)來(lái)的數(shù)據(jù)存入了內(nèi)存,如何將這些數(shù)據(jù)寫(xiě)入文件呢?要發(fā)送的文件如何
8、將其載入內(nèi)存?在這個(gè)程序里我采用了數(shù)據(jù)串行化方法。也就是通過(guò)對(duì)象的Serialize()的重載來(lái)實(shí)現(xiàn)文件的存取。我在程序中采用了通過(guò)重載CObject類中的Serialize()的方式,具體做法是:從文件中讀取文件數(shù)據(jù)存入數(shù)組,利用CArchive的重載運(yùn)算符 << ,將數(shù)組數(shù)據(jù)讀入內(nèi)存,而存數(shù)據(jù)過(guò)程與其相反。6、接收數(shù)據(jù)判斷是否傳輸完畢的方法文件接受數(shù)據(jù)時(shí)怎樣才能判斷已經(jīng)接受完畢呢?我采用的方法是在傳輸包上加標(biāo)記位的方法。每發(fā)送一個(gè)數(shù)據(jù)包,總在最前面加一個(gè)位m_WEnd,如果標(biāo)記為0,說(shuō)明未傳輸完畢,以后還有數(shù)據(jù)傳送過(guò)來(lái),如果標(biāo)記為1,說(shuō)明已經(jīng)傳輸完畢,可以進(jìn)行一些后續(xù)工作。而另
9、一端,每接受一個(gè)數(shù)據(jù)包,就檢查以下該標(biāo)記位,以確定是否傳輸完畢。四、實(shí)驗(yàn)運(yùn)行測(cè)試1、建立服務(wù)器用于顯示狀態(tài)用于接收文件用于發(fā)送文件用于客戶端連接用于建立服務(wù)器2、客戶端建立連接3、發(fā)送文件a、客戶端發(fā)送b、服務(wù)器端接收4、成功發(fā)送5、在E:盤中查找接收到的文件此為接收到的文件五、心得體會(huì)在這五天的時(shí)間里我按照設(shè)計(jì)書(shū)的要求應(yīng)用網(wǎng)絡(luò)編程的相關(guān)知識(shí)編寫(xiě)了一個(gè)實(shí)現(xiàn)文件傳輸?shù)膽?yīng)用程序。在編寫(xiě)過(guò)程中,收獲頗豐。首先是對(duì)TCP協(xié)議和UDP協(xié)議有了更進(jìn)一步的認(rèn)識(shí);其次在編寫(xiě)過(guò)程中,通過(guò)翻閱書(shū)籍學(xué)習(xí)了VC+編程和MFC的相關(guān)內(nèi)容,拓展了自己的知識(shí)面,學(xué)到了很多在課堂上無(wú)法學(xué)到的東西。當(dāng)然,由于對(duì)Socket編程
10、畢竟還不太熟練,難免會(huì)出現(xiàn)一些問(wèn)題,現(xiàn)將這些問(wèn)題總結(jié)如下:1、開(kāi)始時(shí)在數(shù)據(jù)串行化的設(shè)計(jì)時(shí),直接用 CArchive類的對(duì)象 << CFile類的對(duì)象或CArchive類的對(duì)象 >> CFile類的對(duì)象出現(xiàn)錯(cuò)誤,查閱MSDN發(fā)現(xiàn)不能直接用 << 運(yùn)算符不能直接對(duì)CFile類的對(duì)象進(jìn)行操作。2、接收端操作同數(shù)據(jù)的傳輸必須同步,即必須確保在接收數(shù)據(jù)時(shí),應(yīng)確保數(shù)據(jù)已經(jīng)傳送到了接收端,也就是防止因?yàn)閿?shù)據(jù)為傳送過(guò)來(lái)而導(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;所幸的是這些問(wèn)題都在參考資料和老師的幫助下得到了解決。最終圓滿的完成了課程設(shè)計(jì)任務(wù)書(shū)的要求。自身分析問(wèn)題和解決問(wèn)題的能力也得到了提升,為以后的實(shí)驗(yàn)設(shè)計(jì)奠定了良好的基礎(chǔ)。在這里要感謝老師對(duì)我的悉心指導(dǎo),您辛苦了!六、程序源代碼1、建立服務(wù)器偵聽(tīng)套接字的類CListenSocket的定義與實(shí)現(xiàn)定義部分:class CListenSocket : public Csocket/該類用于服務(wù)器端的偵聽(tīng)public:CTcpDlg *m_pSendDlg;/加該成員為了調(diào)用其內(nèi)的函數(shù)。public:CListenSocket(CTcpDlg
12、*pSendDlg);virtual CListenSocket();public:virtual void OnAccept(int nErrorCode);實(shí)現(xiàn)部分:CListenSocket:CListenSocket(CTcpDlg *pSendDlg)m_pSendDlg = pSendDlg;void CListenSocket:OnAccept(int nErrorCode) /當(dāng)服務(wù)器端收到客/戶端的連接請(qǐng)求時(shí)執(zhí)行的代碼。 CSocket:OnAccept(nErrorCode);m_pSendDlg->ProcessAccept();2、建立數(shù)據(jù)傳輸套接字的類CTran
13、sSocket的定義與實(shí)現(xiàn)定義部分:class CTransSocket : public Csocket/該類用于兩端的連接和傳輸public:CTcpDlg *m_pSendDlg;public:CTransSocket(CTcpDlg *pSendDlg);virtual CTransSocket();public:virtual void OnReceive(int nErrorCode);實(shí)現(xiàn)部分:CTransSocket:CTransSocket(CTcpDlg *pSendDlg)m_pSendDlg = pSendDlg;void CTransSocket:OnReceive(
14、int nErrorCode) /當(dāng)收到發(fā)送 /端發(fā)送的數(shù)據(jù)時(shí)執(zhí)行的代碼。 CSocket:OnReceive(nErrorCode);m_pSendDlg->SetTip(CString("有數(shù)據(jù)傳送到");m_pSendDlg->SendOrRecv = 2;m_pSendDlg->JudgeButton();3、用于數(shù)據(jù)串行化的類CSave的定義與實(shí)現(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、中元素的個(gè)數(shù)BYTE Bbuf1024; public:CSave();virtual CSave();void Init();virtual void Serialize(CArchive &ar);實(shí)現(xiàn)部分:CSave:CSave()Init();void CSave:Init()/重新定義一個(gè)Init()的原因是不僅在CSave類初始 /化時(shí)將類內(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、主對(duì)話框CTcpDlg類的定義與實(shí)現(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的兩個(gè)緩沖區(qū)CArchive *m_pArchiveOut;CString m_strFileName;/用于存儲(chǔ)文件名int SendOrRecv; /send 1; receive 2; nothing 0;int ServerClient; /Serve
18、r-1,Client-2int iEnd;/用于控制意外中斷發(fā)送信號(hào)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();實(shí)現(xiàn)部分:系統(tǒng)定義函數(shù)實(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()/不時(shí)地調(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)答客戶端的連接請(qǐ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ù)器已啟動(dòng)");ServerClient = 1;iEnd = 1;return;delete m_pListenSocket;m_pListenSocket = NULL;JudgeButton();SetTip(CString("服務(wù)器無(wú)法啟動(dòng)");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("強(qiáng)制斷開(kāi)連接");ServerClient = 0;void CTcpDlg:ProcessRecv()/與下面的ReceiveFile()共同來(lái)接收文件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("對(duì)方已經(jīng)斷開(kāi)連接,文件傳輸中斷!刪除文件?",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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海市縣(2024年-2025年小學(xué)五年級(jí)語(yǔ)文)統(tǒng)編版階段練習(xí)(下學(xué)期)試卷及答案
- 四年級(jí)數(shù)學(xué)(除數(shù)是兩位數(shù))計(jì)算題專項(xiàng)練習(xí)及答案
- 高三地理第一輪教案-中國(guó)地理
- 山西省大同市2024-2025學(xué)年上學(xué)期期中教學(xué)質(zhì)量監(jiān)測(cè)八年級(jí)物理(含答案)
- 低音吉他產(chǎn)業(yè)運(yùn)行及前景預(yù)測(cè)報(bào)告
- 頭發(fā)護(hù)理咨詢行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 寵物用除虱梳產(chǎn)業(yè)規(guī)劃專項(xiàng)研究報(bào)告
- 勺形鏟餐具市場(chǎng)需求與消費(fèi)特點(diǎn)分析
- 人教版英語(yǔ)八年級(jí)下冊(cè) Unit 1 Section A (1a-2d)隨堂練習(xí)
- 人教版八年級(jí)英語(yǔ)上冊(cè)Unit 3 Section A 測(cè)試卷
- 24春國(guó)家開(kāi)放大學(xué)《機(jī)電控制與可編程控制器技術(shù)》形考任務(wù)1-3+專題報(bào)告參考答案
- 第三單元 運(yùn)算律(單元測(cè)試)-2023-2024學(xué)年四年級(jí)下冊(cè)數(shù)學(xué)人教版
- 教育科學(xué)規(guī)劃課題申請(qǐng)書(shū)《基于生活化的幼兒數(shù)學(xué)教學(xué)活動(dòng)研究》
- 小班數(shù)學(xué)《認(rèn)識(shí)數(shù)字4》課件
- 腦梗死合并高血壓患者個(gè)案護(hù)理
- 2024年中國(guó)能源建設(shè)集團(tuán)國(guó)際工程有限公司招聘筆試參考題庫(kù)含答案解析
- 高職專業(yè)人才培養(yǎng)方案-會(huì)計(jì)專業(yè)人才培養(yǎng)方案
- 服裝自創(chuàng)品牌策劃方案
- 《美容營(yíng)養(yǎng)學(xué)》課件-第八章 第一節(jié) 美胸豐胸概述
- 污染源識(shí)別培訓(xùn)課件
- 名爵汽車MG5說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論