停止等待協(xié)議實(shí)驗(yàn)報(bào)告_第1頁
停止等待協(xié)議實(shí)驗(yàn)報(bào)告_第2頁
停止等待協(xié)議實(shí)驗(yàn)報(bào)告_第3頁
停止等待協(xié)議實(shí)驗(yàn)報(bào)告_第4頁
停止等待協(xié)議實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實(shí)驗(yàn) 停止等待協(xié)議分析與協(xié)議模擬實(shí)現(xiàn)一、 實(shí)驗(yàn)?zāi)康暮腿蝿?wù)1.掌握停止等待協(xié)議的原理及分析過程包括使用狀態(tài)轉(zhuǎn)移圖進(jìn)行協(xié)議的分析。2.在計(jì)算機(jī)上編程模擬停止等待協(xié)議的工作過程并實(shí)現(xiàn)文件的端到端傳輸。3.能夠在文件的傳輸過程中表現(xiàn)出協(xié)議運(yùn)行所遇到的各種狀況,如丟包,差錯(cuò)控制等二、 分析與設(shè)計(jì)1.設(shè)計(jì)任務(wù)分析:停止等待協(xié)議是數(shù)據(jù)鏈路層的幾個(gè)協(xié)議中最簡(jiǎn)單的協(xié)議,是具有最簡(jiǎn)單流量控制的數(shù)據(jù)鏈路層協(xié)議,是數(shù)據(jù)鏈路層各種協(xié)議的基礎(chǔ)。實(shí)驗(yàn)是基于winsock編程,是visual C+6.0 win32控制臺(tái)運(yùn)用程序?qū)崿F(xiàn)的。它采用客戶機(jī)/服務(wù)器(C/S)模型,即發(fā)送數(shù)據(jù)的一端為客戶端,接

2、收數(shù)據(jù)的一端為服務(wù)器端。停止等待協(xié)議就是通過雙方的收發(fā)數(shù)據(jù)而達(dá)到相互通信的目的。本實(shí)驗(yàn)通過編程模擬實(shí)現(xiàn)停止等待協(xié)議,隨機(jī)的發(fā)送文件,通過服務(wù)器的的接受結(jié)果和客戶端的接受結(jié)果顯示理解停止等待協(xié)議的原理,掌握其應(yīng)用。2.  協(xié)議分析假定 1: 鏈路是理想的傳輸信道,所傳送的任何數(shù)據(jù)既不會(huì)出差錯(cuò)也不會(huì)丟失。假定 2: 不管發(fā)方以多快的速率發(fā)送數(shù)據(jù),收方總是來得及收下,并及時(shí)上交主機(jī)。這個(gè)假定就相當(dāng)于認(rèn)為:接收端向主機(jī)交付數(shù)據(jù)的速率永遠(yuǎn)不會(huì)低于發(fā)送端發(fā)送數(shù)據(jù)的速率。 如果存在這樣的傳輸信道,數(shù)據(jù)鏈路層協(xié)議也是不需要的。信道不會(huì)出錯(cuò),而且接收方緩存的容量為無限大而永遠(yuǎn)不會(huì)溢出;或接收速率與發(fā)送

3、速率絕對(duì)精確相等。在上述兩個(gè)假定的情況下,數(shù)據(jù)鏈路層當(dāng)然就不需要任何協(xié)議就可以保證數(shù)據(jù)傳輸?shù)恼_。這就是說,傳輸數(shù)據(jù)的信道是不可靠的(即不能保證所傳的數(shù)據(jù)不產(chǎn)生差錯(cuò)),并且還需要對(duì)數(shù)據(jù)的發(fā)送端進(jìn)行流量控制?,F(xiàn)在不能保證接收端向主機(jī)交付數(shù)據(jù)的速率永遠(yuǎn)不低于發(fā)送端發(fā)送數(shù)據(jù)的速率。由收方控制發(fā)方的數(shù)據(jù)流收方每接受到發(fā)方一幀后,回復(fù)確認(rèn)幀,讓發(fā)方繼續(xù)發(fā)送下一幀,并且收方將數(shù)據(jù)幀交給上層軟件識(shí)別,出現(xiàn)錯(cuò)誤就將幀丟掉. 在大多數(shù)協(xié)議中,流量控制是一組過程,這組過程是用來告訴發(fā)送方在等待接收方的應(yīng)答信號(hào)之前最多可以傳送多少數(shù)據(jù)。流量控制有兩個(gè)要點(diǎn):(1)數(shù)據(jù)流不能使接收方過載。任何接收設(shè)備都有一個(gè)處理輸入數(shù)

4、據(jù)的速率限制,并且存儲(chǔ)輸入數(shù)據(jù)的存儲(chǔ)器容量也是有限的。接收設(shè)備必須在達(dá)到這些限制之前通知發(fā)送設(shè)備并且請(qǐng)求發(fā)送設(shè)備發(fā)送較少的數(shù)據(jù)幀或是暫停一會(huì)兒。在使用輸入數(shù)據(jù)之前,需要對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)和處理,因此,每個(gè)接收設(shè)備都有一塊存儲(chǔ)器,叫做緩沖區(qū),用于存放未來得及處理的數(shù)據(jù)幀。如果緩沖區(qū)將滿,接收方也必須能夠通知發(fā)送方暫停傳輸,直到接收方又能接收數(shù)據(jù)。(2)應(yīng)答。隨著數(shù)據(jù)幀的到來,接收方對(duì)他們進(jìn)行應(yīng)答,可以每收到一幀給一個(gè)應(yīng)答,也可以一次對(duì)若干幀進(jìn)行應(yīng)答。如果一個(gè)幀到達(dá)時(shí)已經(jīng)被破壞,接收方發(fā)送一個(gè)否定應(yīng)答幀(NAK)。在數(shù)據(jù)鏈路層,差錯(cuò)控制主要指錯(cuò)誤檢測(cè)和重傳方法。在一個(gè)幀中出現(xiàn)任何一個(gè)錯(cuò)誤,接收方就返回

5、一個(gè)否定應(yīng)答幀,出錯(cuò)的幀就被發(fā)送方重新傳送。這個(gè)過程被稱作自動(dòng)重復(fù)請(qǐng)求(ARQ)。數(shù)據(jù)被重傳的情況有三種:幀破壞、幀丟失和應(yīng)答幀丟失。流量控制和差錯(cuò)控制是結(jié)合在一起實(shí)現(xiàn)的,共有兩種實(shí)現(xiàn)流量控制和差錯(cuò)控制的技術(shù):停止等待協(xié)議和滑動(dòng)窗口協(xié)議。可以用多種方法來表示一個(gè)有限狀態(tài)機(jī),對(duì)協(xié)議進(jìn)行描述,以下只描述一種。1)混合描述方法比較實(shí)用的辦法是合并一些狀態(tài),即考慮一些次要的細(xì)節(jié)。例如,甲方的狀態(tài) 1 和狀態(tài) 2,狀態(tài) 3和狀態(tài) 4 都可以合并,乙的狀態(tài) 1 和狀態(tài) 4,狀態(tài) 2 和狀態(tài) 3 也可進(jìn)行合并。這樣可以用 3 個(gè)字符 XYZ 表示整個(gè)系統(tǒng)的狀態(tài),其中 X0 或 1,對(duì)應(yīng)于甲方準(zhǔn)備發(fā) 0 或

6、1(包括發(fā)完后等待 ACK 的狀態(tài));Y0 或 1,對(duì)應(yīng)于乙方期望收到 0 或 1;Z0、l、A或,對(duì)應(yīng)于信道上傳送的是 0、1、ACK 或出現(xiàn)了差錯(cuò)(包括丟失)。這樣,就可得出 圖3-24 的有限狀態(tài)機(jī)。在弧線(或直線)旁邊注明的數(shù)字為狀態(tài)變遷的標(biāo)號(hào),其意義也注明在 圖3-24 的右方。假設(shè)系統(tǒng)一開始處在(000)狀態(tài)。這表示甲發(fā)完 0,乙期望收到 0,而信道上傳送的也是 0。在無差錯(cuò)的情況下,系統(tǒng)的狀態(tài)僅在 4 個(gè)狀態(tài)中循環(huán):(000)(01A)(111)(10A)(000) 。從理論上講,應(yīng)當(dāng)共有 2 × 2 × 4 = 16 種不同的狀態(tài)。去掉沒有意義的組合后,還剩

7、下 10 種狀態(tài),而導(dǎo)致狀態(tài)變遷的輸人事件共有 9 種( 標(biāo)號(hào) 0 8 )。這種有限狀態(tài)機(jī)可幫助我們檢查協(xié)議是否正確。例如,檢查一下乙方會(huì)不會(huì)連續(xù)將兩個(gè) 0 號(hào)幀送交主機(jī)。這相當(dāng)于檢查一下會(huì)不會(huì)出現(xiàn)這種情況,即在兩次出現(xiàn)狀態(tài)變遷 1 之間不出現(xiàn)狀態(tài)變遷 3 。仔細(xì)檢查 圖3-24 就可發(fā)現(xiàn)這種情況是不會(huì)發(fā)生的。同樣方法也可用來排除連續(xù)將兩個(gè) 1 號(hào)幀送交主機(jī)的可能。再檢查一下會(huì)不會(huì)發(fā)生甲方連續(xù)改變狀態(tài) 2 次( 如從 0 到 1,再回到 0 )而乙方的狀態(tài)未改變。這種情況相當(dāng)于出現(xiàn)了未被發(fā)現(xiàn)的報(bào)文丟失。可以看出,這種情況也是不存在的。協(xié)議必須不出現(xiàn)死鎖。死鎖的出現(xiàn)是因?yàn)榇嬖谥@樣的一種狀態(tài)子集

8、,其特點(diǎn)是:從這一子集內(nèi)變遷到子集外是不可能的,而在這一子集內(nèi)狀態(tài)的變遷總是局限于子集內(nèi)的幾個(gè)狀態(tài)。可以看出,如圖 所示的自動(dòng)機(jī)沒有死鎖現(xiàn)象。3設(shè)計(jì)方案論證當(dāng)收方收到一個(gè)正確的數(shù)據(jù)幀后,便會(huì)向發(fā)方發(fā)送一個(gè)確認(rèn)幀ACK,表示發(fā)送的數(shù)據(jù)正確接收。當(dāng)發(fā)方收到確認(rèn)幀后才能發(fā)送一個(gè)新的數(shù)據(jù)幀,這樣就實(shí)現(xiàn)了接收方對(duì)發(fā)送方的流量控制。由于通信線路質(zhì)量各方面的影響,數(shù)據(jù)幀從發(fā)送方到接收方傳輸?shù)倪^程中可能會(huì)出現(xiàn)差錯(cuò)。為了保證數(shù)據(jù)的正確性和完整性,接收方在收到數(shù)據(jù)后,會(huì)用一定的方法對(duì)接收到的數(shù)據(jù)進(jìn)行差錯(cuò)檢驗(yàn),所以接收方很容易檢測(cè)出收到的數(shù)據(jù)幀是否出現(xiàn)差錯(cuò)。當(dāng)接收方發(fā)現(xiàn)收到的數(shù)據(jù)出現(xiàn)差錯(cuò)時(shí),就會(huì)向發(fā)送方發(fā)送一個(gè)否認(rèn)

9、幀NAK,表示對(duì)方發(fā)送的數(shù)據(jù)錯(cuò)誤。發(fā)送方會(huì)根據(jù)接收方發(fā)來的信息做出相應(yīng)的操作。采用這樣的有效的檢錯(cuò)機(jī)制,數(shù)據(jù)鏈路層可以對(duì)上面的網(wǎng)絡(luò)層提供了可靠的傳輸?shù)姆?wù)。三、 系統(tǒng)運(yùn)行與驗(yàn)證程序分兩部分:客戶程序和服務(wù)器程序。工作過程是: 服務(wù)器首先啟動(dòng),它創(chuàng)建套接字之后等待客戶的連接;客戶啟動(dòng)后創(chuàng)建套接字,然后和服務(wù)器建立連接;建立連接后,客戶寫入文件的路徑,然后將文件發(fā)送到服務(wù)器,服務(wù)器要求寫入保存的文件路徑,收到到文件后,將接收到的文件保存到指定路徑當(dāng)中。服務(wù)器端運(yùn)行圖: 客戶端運(yùn)行圖成功發(fā)送文件后的服務(wù)器端客戶端文件發(fā)送失敗 客戶端的響應(yīng)客戶端向服務(wù)器端發(fā)送文件請(qǐng)求ENQ,但是沒有收到返回幀,客戶端

10、顯示send file failed,而file send failed表明文件經(jīng)過規(guī)定次數(shù)重傳后文件還是發(fā)送失敗。四、 總結(jié)與體會(huì)1. 分組情況 張潤(rùn):負(fù)責(zé)停止等待協(xié)議模擬客戶端程序的編寫、調(diào)試。毛鳳陽:負(fù)責(zé)停止等待協(xié)議模擬服務(wù)端程序的編寫、調(diào)試。黃曉明:負(fù)責(zé)查閱相關(guān)資料,實(shí)驗(yàn)報(bào)告的撰寫,編寫頭文件。2. 總結(jié)通過本次實(shí)驗(yàn)及課上老師講解,對(duì)停止等待協(xié)議有了更深刻的了解。并且通過C/S代碼的編寫運(yùn)行,形象地看到客戶/服務(wù)器端的運(yùn)作方式,對(duì)于C/S模型有了很深刻的印象以及進(jìn)一步理解。通過代碼的編寫,再一次熟悉Socket編程原理,掌握簡(jiǎn)單的套接字編程。運(yùn)行程序成功后,是在同一臺(tái)電腦上進(jìn)行C與S端

11、的連接。而且使用的是TCP協(xié)議,所以要模擬停止等待協(xié)議發(fā)送丟包,超時(shí)等情況比較困難。僅僅實(shí)現(xiàn)了文件發(fā)送時(shí)等待應(yīng)答信號(hào)超時(shí)的情況。編程時(shí)遇到許多困難,從一個(gè)新手通過查閱相關(guān)的資料和以前的學(xué)習(xí)以及和同學(xué)之間的交流進(jìn)步到逐步了解。在設(shè)計(jì)過程中,組員之間相互促進(jìn),相互交流,共同進(jìn)步。發(fā)送端程序/ sender.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。/#include "stdafx.h"#include <iostream>#include <WinSock2.h>#include <string.h>#include "./head

12、er/ARQ.h"#include "./header/Exception.h"/ 服務(wù)器端口#define SERVER_PORT 2280/最大重傳次數(shù)#define MAXRETRY 8/傳送傳時(shí)時(shí)間#define TIMEOUT 3000#pragma comment(lib,"ws2_32.lib")/設(shè)置link時(shí)的lib庫,加入ws2_32.lib到工程,此庫文件與socket編程有關(guān) /也可以在MFC中通過在project->settings->link中加入 /主要是獲得Ws2_32.dll using names

13、pace std;SOCKET PrimaryUDP;/定義一個(gè)socket號(hào)char ServerIP20;/定義數(shù)組保存服務(wù)器的IP地址char FilePathMAX_PATH;/定義文件的路徑存儲(chǔ)數(shù)/ 用作奇偶檢校的序號(hào)bool g_number = false;/返回的控制字符char g_bcc;HANDLE m_hEvent;void InitWinSock() /初始化socketWSADATA wsaData;/The WSADATA structure is used to store Windows Sockets initialization information /

14、returned by a call to the AfxSocketInit global function.if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)/The WSAStartup function initiates use of Ws2_32.dll by a process. /The MAKEWORD macro creates a WORD value by concatenating the specified values. throw Exception("Windows sockets 2.2 start

15、up unsuccessful");elseprintf("Using %s (Status: %s)n",wsaData.szDescription, wsaData.szSystemStatus);printf("with API versions %d.%d to %d.%dnn",LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion);void mksock(int type

16、) /創(chuàng)建socket號(hào)PrimaryUDP = socket(AF_INET, type, 0);/socket()函數(shù)創(chuàng)建一個(gè)socket號(hào)if (PrimaryUDP < 0)throw Exception("create socket error");void BindSock() /綁定一個(gè)socket號(hào)和本地進(jìn)程(用地址和端口號(hào)描述)sockaddr_in sin; /定義一個(gè)套接字地址sin.sin_addr.S_un.S_addr = INADDR_ANY;/ 獲取本地IP地址sin.sin_family = AF_INET; /協(xié)議族TCP/IPsi

17、n.sin_port = 0; /系統(tǒng)隨機(jī)獲取端口號(hào)if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin) < 0)/綁定throw Exception("bind error");bool ASendto()sockaddr_in remote;remote.sin_addr.S_un.S_addr = inet_addr(ServerIP);remote.sin_family = AF_INET;remote.sin_port = htons(SERVER_PORT);int fromlen = s

18、izeof(remote);/打開文件FILE * file;if(file = fopen(FilePath, "rb") = NULL)/"rb"說明文件只讀并按二進(jìn)制方式打開cout<<FilePath<<" open error"<<endl;return false;cout<<"file open succeed"<<endl;/ 設(shè)置文件指針位置SetFilePointer(file, 0, NULL, FILE_BEGIN);/使FILE_

19、BEGIN指向文件開頭BSC bsc;bsc.header = STX;bsc.tail = ETX;/設(shè)置為有信號(hào)狀態(tài)SetEvent(m_hEvent);/分段序號(hào)bool number = false;unsigned long dwRead = -1;bool sendComplete = false;while(!sendComplete)/清空數(shù)據(jù)memset(bsc.data, 0, MAXBSCLENGTH);/把bsc.data前MAXBSCLENGTH字符用代替/當(dāng)前分塊的奇偶序號(hào)bsc.number=number;/記錄當(dāng)前的分塊序號(hào)g_number = bsc.numb

20、er;if (dwRead =-1)/第一次應(yīng)發(fā)送文件請(qǐng)求消息/發(fā)送文件請(qǐng)求bsc.bcc = ENQ;/詢問cout<<"ENQ"char * filename = FilePath;if (filename = strrchr(FilePath,'')=NULL)/在FilePath中尋找字符,返回指向最后一個(gè)字符的指針filename = FilePath;/獲取文件名else+filename;strcpy(bsc.data,filename);dwRead = 0;elseif(!feof(file)/如果沒有檢查到file的結(jié)束符bs

21、c.bcc = SYN; /同步cout<<"SYN"int i = fread(bsc.data, sizeof(char),MAXBSCLENGTH , file);/把文件讀入bsc.data,返回字節(jié)數(shù)cout<<"read:"<<i<<"tsend:"<<sizeof(bsc.data)<<endl;dwRead+=i;/deRead等于讀到的字節(jié)數(shù)else/發(fā)送完畢bsc.bcc = EOT;/結(jié)束cout<<"EOT"

22、sendComplete = true;cout<<"send complete.send size:"<<dwRead<<endl;fclose(file);/MAXRETRY為最大達(dá)重傳次數(shù)for(int i=0;i<MAXRETRY;i+)sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,fromlen);ResetEvent(m_hEvent);/設(shè)置為無信號(hào)狀態(tài)DWORD reslut = WaitForSingleObject(m

23、_hEvent,TIMEOUT);/等待信號(hào)的到來,如果在TIMEOUT時(shí)間內(nèi)信號(hào)不到來, /線程不再等待,函數(shù)返回,如果想讓線程一直等待,需設(shè)置該參數(shù)為INFINITEif (reslut = WAIT_OBJECT_0)/說明事件是有信號(hào)狀態(tài)返回/收到應(yīng)答消息,一種是ACK,一種是NAKif (g_bcc = NAK)if (i = MAXRETRY -1)return false;/繼續(xù)重傳continue;else/收到應(yīng)答消息cout<<"send succeed"<<endl;break;else if(i = MAXRETRY-1)/沒

24、有收到返回幀cout<<"send file failed"<<endl;return false;/開始發(fā)下一段數(shù)據(jù)number = !number;return true;DWORD WINAPI ARecv(LPVOID lpParam)sockaddr_in remote;int sinlen = sizeof(remote);BSC buffer;int iread = 0;while (true)iread = recvfrom(PrimaryUDP,(char*)&buffer,sizeof(buffer),0,(sockadd

25、r*)&remote,&sinlen);/處理ACK與NAKif (iread = SOCKET_ERROR)continue;/與當(dāng)前的分塊序號(hào)進(jìn)行比較,看是不是當(dāng)前塊的應(yīng)答if (buffer.number!=g_number)continue;if (buffer.bcc = ACK | buffer.bcc = NAK)/保存返回的控制字符g_bcc = buffer.bcc;SetEvent(m_hEvent);/設(shè)置為有信號(hào)狀態(tài)return 0;int _tmain(int argc, _TCHAR* argv) /main函數(shù)InitWinSock();mksoc

26、k(SOCK_DGRAM);BindSock();cout<<"Please input receiver ip:"cin>>ServerIP;cout<<"Please input the file path:"cin>>FilePath;m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);/If the function succeeds, the return value is a handle /to the event object. /創(chuàng)建一個(gè)空事件對(duì)

27、象,返回一個(gè)句柄CreateThread(NULL, 0, ARecv, NULL, 0, NULL); /The CreateThread function creates a thread to execute /within the virtual address space of the calling process. /執(zhí)行ARecv函數(shù)if (!ASendto()cout<<"file send failed"<<endl;getchar();getchar();getchar();return 0;接收端程序:/ receiver.c

28、pp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。#include "stdafx.h"#include <iostream>#include <WinSock2.h>#include "./header/ARQ.h"#include "./header/Exception.h"/ 服務(wù)器端口#define SERVER_PORT 2280#pragma comment(lib,"ws2_32.lib")/設(shè)置link時(shí)的lib庫using namespace std;SOCKET PrimaryUDP

29、;char FileSavePathMAX_PATH;void InitWinSock()WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)throw Exception("Windows sockets 2.2 startup unsuccessful");elseprintf("Using %s (Status: %s)n",wsaData.szDescription, wsaData.szSystemStatus);printf("with API vers

30、ions %d.%d to %d.%dnn",LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion);void mksock(int type)PrimaryUDP = socket(AF_INET, type, 0);if (PrimaryUDP < 0)throw Exception("create socket error");void BindSock()sockaddr_in sin;s

31、in.sin_addr.S_un.S_addr = INADDR_ANY;sin.sin_family = AF_INET;sin.sin_port = htons(SERVER_PORT);if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin) < 0)throw Exception("bind error");DWORD WINAPI ARecv(LPVOID lpParam)FILE * file = NULL;sockaddr_in remote;int sinlen = sizeof(remo

32、te);BSC buffer,bsc;bsc.header = STX;bsc.tail = ETX;memset(bsc.data, 0, MAXBSCLENGTH);int iread = 0;unsigned long dwReceived = 0;bool number = true;/發(fā)送方的數(shù)據(jù)開始發(fā)送時(shí)的序號(hào)設(shè)為,為了判斷是不是第一次一段數(shù)據(jù),所以這里標(biāo)為while (true)iread = recvfrom(PrimaryUDP,(char*)&buffer,sizeof(buffer),0,(sockaddr*)&remote,&sinlen);if

33、 (SOCKET_ERROR = iread | buffer.header != STX | buffer.tail != ETX)/數(shù)據(jù)錯(cuò)誤,發(fā)送負(fù)應(yīng)答cout<<"received a error data"<<endl;bsc.bcc = NAK;bsc.number=false;/number這時(shí)沒有實(shí)際的意義sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);continue;if (buffer.number = number)/重

34、復(fù)收到數(shù)據(jù),發(fā)送應(yīng)答消息cout<<"received a repeat data"<<endl;bsc.bcc = ACK;bsc.number = buffer.number;sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);continue;switch(buffer.bcc)case ENQ:number = !number;/準(zhǔn)備接收下一段數(shù)據(jù)/文件請(qǐng)求cout<<"received a file request message,filename:"<<buffer.data<<endl;/打開文件if(strcmp(FileSavePath+strlen(FileSavePath)-1),"")!=0)strcat(FileSavePath,"");strcat(FileSavePath,buffer.data);if(file = fopen(FileSavePath, "ab") =

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論