滑動窗口協(xié)議_第1頁
滑動窗口協(xié)議_第2頁
滑動窗口協(xié)議_第3頁
滑動窗口協(xié)議_第4頁
滑動窗口協(xié)議_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、/*接收端程序:#pragmacomment(lib,"ws2_32.lib")#include<winsock.h>#include<stdio.h>#include<time.h>/接收幀/BOOLReceiveFrame(int*frameExcept,int*frameRecv,intwinRecvSize,SOCKETsocket)charrecvBuffer128;/接收數(shù)據(jù)intframeNum;/接收幀號從發(fā)送端接收幀if(recv(socket,recvBuffer,sizeof(recvBuffer),0)=SOCKE

2、T_ERROR)printf("接收數(shù)據(jù)失??!n");returnFALSE;frameNum=atoi(recvBuffer);if(frameNum!=*frameExcept)/接收幀和希望接收幀號不匹配printf("所要接收的幀和接收到的幀不匹配!,要接收的幀號是:d,接收到的幀號是:dn",*frameExcept,frameNum);returnFALSE;else/腰收幀和希望接收幀號匹配*frameRecv=frameNum;printf("已經(jīng)成功地接收幀d,接收端窗口大小是:dn",*frameRecv,winR

3、ecvSize);returnTRUE;/發(fā)送ACK/BOOLSendACK(int*frameExcept,int*frameRecv,SOCKETsocket)通過隨機(jī)數(shù)隨機(jī)產(chǎn)生正確ACK幀號、錯誤ACK幀號以及不發(fā)送ACK幀charsendBuffer128;/發(fā)送數(shù)據(jù)intrandom=0;/隨機(jī)數(shù)0,1,2,0表示返回正確ACK1表示返回錯誤ACK2表示不返回ACKrandom=rand()%3;if(random=0)表示正確接收,并且正確回復(fù)ACK(if(_snprintf(sendBuffer,sizeof(sendBuffer)-1,"%d",*frame

4、Recv)<0)(printf("寫數(shù)據(jù)出錯!n");returnFALSE;else(sendBuffersizeof(sendBuffer)-1='0'發(fā)送正確的ACKif(send(socket,sendBuffer,sizeof(sendBuffer),0)=SOCKET_ERROR)(printf("發(fā)送數(shù)據(jù)失?。");returnFALSE;else(*frameExceptA=1;/經(jīng)過確認(rèn),準(zhǔn)備接受下一幀printf("針對已經(jīng)接收到的幀d回復(fù)ACK,回復(fù)的ACK號是%d:nn",*frameR

5、ecv,*frameRecv);elseif(random=1)/表示正確接收,并且錯誤回復(fù)ACK(if(_snprintf(sendBuffer,sizeof(sendBuffer)-1,"%d",(*frameRecv)A1)<0)(printf("寫數(shù)據(jù)出錯!n");returnFALSE;else(sendBuffersizeof(sendBuffer)-1='0;發(fā)送錯誤的ACKif(send(socket,sendBuffer,sizeof(sendBuffer),0)=SOCKET_ERROR)(printf("發(fā)送

6、數(shù)據(jù)失??!n");returnFALSE;)else(printf("針對已經(jīng)接收到的幀d回復(fù)ACK,回復(fù)的ACK號是%d:nn",*frameRecv,(*frameRecv)A1);)else/加示正確接收,并且不回復(fù)ACK(/不發(fā)送ACKprintf("沒有針對已經(jīng)接收到的幀%d發(fā)送ACKnn",*frameRecv);)returnTRUE;)/初始化發(fā)送端監(jiān)聽socket/BOOLInitSocketReceiver(SOCKET*socketRecv)(WORDwVersionRequested;WSADATAwsaData;SOC

7、KADDR_INaddrSender;intlength=sizeof(structsockaddr);/版本wVersionRequested=MAKEWORD(1,1);/啟動if(WSAStartup(wVersionRequested,&wsaData)!=0)(printf("啟動socket不成功!n");returnFALSE;)if(LOBYTE(wsaData.wVersion)!=1|HIBYTE(wsaData.wVersion)!=1)(printf("版本錯誤!n");WSACleanup();returnFALSE;)

8、/創(chuàng)建socket*socketRecv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(socket=INVALID_SOCKET)(printf("創(chuàng)建套接字失敗!n");returnFALSE;創(chuàng)建地址信息addrSender.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");/發(fā)送端主機(jī)IPaddrSender.sin_family=AF_INET;addrSender.sin_port=htons(8000);/端口連接發(fā)送端if(connect(*socketRecv

9、,(structsockaddr*)&addrSender,length)=SOCKET_ERROR)(printf("連接服務(wù)器失敗!n");WSACleanup();returnFALSE;returnTRUE;voidmain()(SOCKETsocketRecv;/接收端socketintframeExcept=0;/期待的幀號intwinRecvSize=1;窗口大小intframeRecv=0;接收的幀號intcount=0;/循環(huán)次數(shù)計數(shù)器BOOLrecvFlag=FALSE;/是否正確接收幀連接服務(wù)器if(!InitSocketReceiver(&a

10、mp;socketRecv)(printf("初始化客戶端失敗,退出!n");WSACleanup();return;else(%d,準(zhǔn)備接收發(fā)送端數(shù)據(jù)nn",winRecvSize);printf("已經(jīng)成功連接服務(wù)器nn");printf("初始狀態(tài)接收端窗口大小是:srand(unsigned)time(NULL);while(count<20)(recvFlag=ReceiveFrame(&frameExcept,&frameRecv,winRecvSize,socketRecv);if(recvFlag

11、)正確接收幀,發(fā)送ACK(SendACK(&frameExcept,&frameRecv,socketRecv);else(printf("得到錯誤的幀!n");+count;printf("模擬結(jié)束!n");清理closesocket(socketRecv);WSACleanup();system("pause");/*發(fā)送端程序:#pragmacomment(lib,"ws2_32.lib")#include<winsock.h>#include<stdio.h>/發(fā)送幀

12、/voidSendFrame(int*frameNumCurrent,intwinSizeCurrent,SOCKET*socketConn)(charsendBuffer128;/發(fā)送數(shù)據(jù)if(_snprintf(sendBuffer,sizeof(sendBuffer)-1,"%d",*frameNumCurrent)<0)(printf("寫數(shù)據(jù)出錯!n");return;else(sendBuffersizeof(sendBuffer)-1='0')發(fā)送數(shù)據(jù)第幾幀if(send(*socketConn,sendBuffer,

13、sizeof(sendBuffer),0)=SOCKET_ERROR)(printf("發(fā)送數(shù)據(jù)失??!n");return;)else(printf("現(xiàn)在在傳送幀%sn",sendBuffer);)/接收ACK/voidReceiveACK(int*frameNumCurrent,SOCKET*socketConn)(charrecvBuffer128;/接收數(shù)據(jù)intlength=sizeof(structsockaddr);intframeNum=0;/接收到的ACK號/接收ACK,判斷是否有超時或者是否錯誤ACKif(recv(*socketCo

14、nn,recvBuffer,sizeof(recvBuffer),0)=SOCKET_ERROR)/出現(xiàn)超時(printf("接收數(shù)據(jù)超時!需要重新傳送幀dnn",*frameNumCurrent);return;)else(frameNum=atoi(recvBuffer);正確ACKif(frameNum=*frameNumCurrent)(/正確ACK準(zhǔn)備傳送下一幀*frameNumCurrentA=1;printf("接收到正確的ACK,已經(jīng)成功傳送幀d,將要傳送幀dnn",(*frameNumCurrent)A1,*frameNumCurren

15、t);)錯誤ACKelseif(frameNum=(*frameNumCurrent)人1)/得到錯誤ACK不進(jìn)行操作,主函數(shù)中進(jìn)行重傳操作printf("接收到錯誤ACK,幀d傳送錯誤,需要重新傳送幀dnn",*frameNumCurrent,*frameNumCurrent);)/初始化發(fā)送端監(jiān)聽socket/BOOLInitSocketSender(SOCKET*socketSender)(SOCKADDR_INaddrSender;WORDwVersionRequested;WSADATAwsaData;/版本wVersionRequested=MAKEWORD(1

16、,1);/啟動if(WSAStartup(wVersionRequested,&wsaData)!=0)(printf("啟動不成功!n");returnFALSE;)if(LOBYTE(wsaData.wVersion)!=1|HIBYTE(wsaData.wVersion)!=1)(printf("版本錯誤!n");WSACleanup();returnFALSE;)/創(chuàng)建socket*socketSender=socket(AF_INET,SOCK_STREAM,0);if(*socketSender=INVALID_SOCKET)(pri

17、ntf("創(chuàng)建套接字失??!n");returnFALSE;)創(chuàng)建地址信息addrSender.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/所有地址addrSender.sin_family=AF_INET;addrSender.sin_port=htons(8000);端口號綁定端口if(bind(*socketSender,(SOCKADDR*)&addrSender,sizeof(structsockaddr)SOCKET_ERROR)printf("綁定失??!n");returnFALSE;/監(jiān)聽if(l

18、isten(*socketSender,SOMAXCONN)=SOCKET_ERROR)printf("監(jiān)聽失?。");returnFALSE;returnTRUE;/線程函數(shù)用于處理一個客戶端請求/DWORDWINAPIConnectClient(LPVOIDsocketConn)intcount=0;/循環(huán)次數(shù)計數(shù)器intwinSizeCurrent=0;/當(dāng)前發(fā)送窗口大小intframeNumCurrent=0;/當(dāng)前發(fā)送的幀號printf("初始狀態(tài)發(fā)送窗口是:d,準(zhǔn)備向接收端發(fā)送數(shù)據(jù)nn",winSizeCurrent);+winSizeCu

19、rrent;while(count<20)SendFrame(&frameNumCurrent,winSizeCurrent,(SOCKET*)socketConn);ReceiveACK(&frameNumCurrent,(SOCKET*)socketConn);+count;printf("模擬結(jié)束!n");關(guān)閉Socketclosesocket(*(SOCKET*)socketConn);free(socketConn);return0;voidmain()HANDLEhThread;/線程句柄DWORDthreadId;SOCKETsocketSender;/監(jiān)聽socketSOCKADDR_INaddrReceiver;/服務(wù)器地址intlength=sizeof(structsockaddr);inttimeOut=3000;/超日3秒初始化發(fā)送端監(jiān)聽socketif(!InitSocket

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論