![網(wǎng)絡(luò)工程課程設(shè)計(jì)-PING程序設(shè)計(jì)與FTP設(shè)計(jì)_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-5/22/36c34df6-fe9d-425d-a7a8-6bb6e38e139e/36c34df6-fe9d-425d-a7a8-6bb6e38e139e1.gif)
![網(wǎng)絡(luò)工程課程設(shè)計(jì)-PING程序設(shè)計(jì)與FTP設(shè)計(jì)_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-5/22/36c34df6-fe9d-425d-a7a8-6bb6e38e139e/36c34df6-fe9d-425d-a7a8-6bb6e38e139e2.gif)
![網(wǎng)絡(luò)工程課程設(shè)計(jì)-PING程序設(shè)計(jì)與FTP設(shè)計(jì)_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-5/22/36c34df6-fe9d-425d-a7a8-6bb6e38e139e/36c34df6-fe9d-425d-a7a8-6bb6e38e139e3.gif)
![網(wǎng)絡(luò)工程課程設(shè)計(jì)-PING程序設(shè)計(jì)與FTP設(shè)計(jì)_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-5/22/36c34df6-fe9d-425d-a7a8-6bb6e38e139e/36c34df6-fe9d-425d-a7a8-6bb6e38e139e4.gif)
![網(wǎng)絡(luò)工程課程設(shè)計(jì)-PING程序設(shè)計(jì)與FTP設(shè)計(jì)_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-5/22/36c34df6-fe9d-425d-a7a8-6bb6e38e139e/36c34df6-fe9d-425d-a7a8-6bb6e38e139e5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1 核準(zhǔn)通過(guò),歸檔資料。 未經(jīng)允許,請(qǐng)勿外傳! 課課 程程 設(shè)設(shè) 計(jì)計(jì) 課程名稱(chēng)_網(wǎng)絡(luò)工程課程設(shè)計(jì) 題目名稱(chēng)_ping 程序設(shè)計(jì) 題目名稱(chēng) 文件傳輸協(xié)議的簡(jiǎn)單設(shè)計(jì) 題目名稱(chēng) 數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì) 學(xué)生學(xué)院_ _ 9jwkffwvg#tym*jg / 數(shù)據(jù)的類(lèi)型 byte i_code; / subcode 類(lèi)型 ushort i_cksum; / 校驗(yàn)和 ushort i_id; / id ushort i_seq; / 序號(hào) ulong timestamp; icmpheader; ipip 頭結(jié)構(gòu)頭結(jié)構(gòu) typedef struct iphdr unsigned int h_len:4;
2、/長(zhǎng)度 unsigned int version:4; / 版本 unsigned char tos; / 服務(wù)類(lèi)型 unsigned short total_len; / 實(shí)際長(zhǎng)度 unsigned short ident; / 標(biāo)識(shí) unsigned short frag_and_flags; /標(biāo)志 unsigned char ttl; /生存時(shí)間 unsigned char proto; /協(xié)議(tcp, udp etc) unsigned short checksum; / ip 校驗(yàn) unsigned int sourceip; unsigned int destip; iphea
3、der; 填寫(xiě)填寫(xiě) icmpicmp 數(shù)據(jù)包數(shù)據(jù)包* * void fill_icmp_data(char * icmp_data, int datasize)/填 充 icmp icmpheader *icmp_hdr; char *datapart; icmp_hdr = (icmpheader*)icmp_data; icmp_hdr-i_type = icmp_echo; icmp_hdr-i_code = 0; icmp_hdr-i_id=(ushort)getcurrentprocessid() icmp_hdr-i_cksum = 0; icmp_hdr-i_seq = 0; d
4、atapart = icmp_data + sizeof(icmpheader); /數(shù)據(jù) 段地址 memset(datapart,0,datasize - sizeof(icmpheader); 計(jì)算校驗(yàn)和計(jì)算校驗(yàn)和 ushort checksum(ushort *buffer, int size)/求校 驗(yàn)和 unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(ushort); if(size) cksum += *(uchar*)buffer; cksum = (cksum 16) + (cksum ck
5、sum += (cksum 16); return (ushort)(cksum); 9 數(shù)據(jù)包解碼數(shù)據(jù)包解碼 int decode_resp(char *buf, int bytes,struct sockaddr_in*from,unsignedlong icmpheader *icmphdr; unsigned short iphdrlen; /ip 頭的長(zhǎng)度 cstring str,str1,str2; iphdr = (ipheader *)buf; iphdrlen = (iphdr-h_len) * 4 ; if (bytes sin_addr); info-addstring(
6、too few bytes from + str1); info-postmessage(wm_vscroll, sb_bottom, 0); /str.format(); icmphdr = (icmpheader*)(buf + iphdrlen); if (icmphdr-i_type != icmp_echoreply) str1.format(%d,icmphdr-i_type); info-addstring(non-echo type + str1 + recvd ); info-postmessage(wm_vscroll, sb_bottom, 0); return 1; i
7、f(icmphdr-i_id!=(ushort)getcurrentprocessid() info-addstring(someone elses packet!); info-postmessage(wm_vscroll, sb_bottom, 0); return 1; int k = (int)iphdr-ttl; cstring ttl; ttl.format(%d,k); str.format(%d,(int) bytes); str1.format(%d,icmphdr-i_seq); str2.format(%d,arrivetime-icmphdr-timestamp); i
8、nfo-addstring(str + bytes from + : + inet_ntoa(from-sin_addr)+ icmp_seq = + str1 + . + time: + str2 + ms. + ttl + ttl); info-postmessage(wm_vscroll, sb_bottom, 0); sleep(1000); return 0; 10 if(bag-select = 1) bag-ipctrl-getaddress( addr ); addr = (dword)htonl(unsigned long)addr); dest.sin_addr = *(
9、in_addr * ) hp = gethostbyaddr(char*) if (hp != null) (bag-dnsctrl)-setsel(0,-1,false); (bag-dnsctrl)-replacesel(hp-h_name); if (!hp) bag-infolist-addstring(unable to resolve + str); return 0; /初始化 dest if (hp) dest.sin_family = hp-h_addrtype; else dest.sin_family = af_inet; /獲取 ip 或域名,并顯示 dest_ip =
10、 inet_ntoa(dest.sin_addr); /將網(wǎng)絡(luò)地址轉(zhuǎn)換成“.”點(diǎn)隔的字符串格式 times=def_packet_number; datasize = def_packet_size; datasize += sizeof(icmpheader); /數(shù)據(jù)段的大小 icmp_data = (char*)xmalloc(max_packet); /為 icmp 分配內(nèi)存 recvbuf = (char*)xmalloc(max_packet); if (!icmp_data) str.format(%d,getlasterror(); bag-infolist-addstring
11、(heapalloc failed + str); return 0; . 11 while(true) /ping 4 次 for(int i=0;ii_cksum = 0; (icmpheader*)icmp_data)-timestamp= gettickcount(); /獲取發(fā)送時(shí)間 (icmpheader*)icmp_data)-i_seq = seq_no+; (icmpheader*)icmp_data)-i_cksum= checksum(ushort*)icmp_data,datasize); /求校驗(yàn)和 bwrote=sendto(sockraw,icmp_data,da
12、tasize,0,(stru ct sockaddr*) /發(fā)送 if (bwrote = socket_error) if (wsagetlasterror() = wsaetimedout) bag-infolist-addstring(request timed out.); bag-infolist-postmessage(wm_vscroll, sb_bottom, 0); continue; str.format(%d,wsagetlasterror(); bag-infolist-addstring(sendto failed: + str); return 0; if (bwr
13、ote infolist-addstring(wrote + str + bytes); bread=recvfrom(sockraw,recvbuf,max_packet ,0,(struct sockaddr*) /接收 arrivetime = gettickcount(); /獲取接收時(shí)間 if (bread = socket_error) if (wsagetlasterror() = wsaetimedout) bag-infolist-addstring(request timed out.); bag-infolist-postmessage(wm_vscroll, sb_bo
14、ttom, 0); continue; str.format(%d,wsagetlasterror(); bag-infolist-addstring(recvfrom failed: + str); return 0; if(!decode_resp(recvbuf,bread, /* 成功接收的數(shù)目+ */ /sleep(1000); if(!bag-t) /等于復(fù)選按鈕的值,為真就做-t,無(wú)限循 環(huán) ping break; /* 顯示統(tǒng)計(jì)結(jié)果 */ str = dest_ip; bag-infolist-addstring(ping statistics for + str); cstr
15、ing str1,str2; str.format(%d,statistic); str1.format(%d,times-statistic); str2.format(%f,(float)(times- statistic)/times*100); bag-infolist-addstring( packets: sent = 4,received = + str + , lost = + str1 + + str2+% loss); bag-infolist-addstring(); wsacleanup(); return 0; 12 測(cè)試步驟及實(shí)驗(yàn)結(jié)果 首先,運(yùn)行程序,使用默認(rèn) ip
16、(本機(jī) ip)ping: 接著,選擇域名,并輸入 ,默認(rèn) ping 次數(shù)為 4 次,在 ip 地址欄可以顯示相 應(yīng)的 ip 地址: 13 : 最后,我們將“-t”選中,連續(xù)循環(huán)“ping”: 結(jié)論 本程序能全部完成課程設(shè)計(jì)的要求功能,能域名解析,ping 服務(wù)器,并能實(shí)現(xiàn)-t 參數(shù) 無(wú)限循環(huán) ping。 界面比較友好,顯示、按鍵等均正常,并有“停止重 ping” 、 “退出”按鍵,能較好 與用戶交互。 缺點(diǎn)是程序不穩(wěn)定,不能很好應(yīng)付網(wǎng)絡(luò)狀況不明朗的情況。 5 思考題思考題 1. 本題目只要求實(shí)現(xiàn) ping 的一些簡(jiǎn)單功能,在 windows 命令行模式下,輸入 “ping”回車(chē),查看 ping
17、 的所有功能,考慮如何實(shí)現(xiàn)這些功能。 答:首先,ping 命令會(huì)構(gòu)建一個(gè)固定格式的 icmp 請(qǐng)求數(shù)據(jù)包,然后由 icmp 協(xié) 議將這個(gè)數(shù)據(jù)包連同地址“”一起交給 ip 層協(xié)議(和 icmp 一樣, 實(shí)際上是一組后臺(tái)運(yùn)行的進(jìn)程),ip 層協(xié)議將以地址“”作為目 的地址,本機(jī) ip 地址作為源地址,加上一些其他的控制信息,構(gòu)建一個(gè) ip 數(shù) 14 據(jù)包,并在一個(gè)映射表中查找出 ip 地址 所對(duì)應(yīng)的物理地址(也叫 mac 地址,熟悉網(wǎng)卡配置的朋友不會(huì)陌生,這是數(shù)據(jù)鏈路層協(xié)議構(gòu)建數(shù)據(jù)鏈路 層的傳輸單元幀所必需的),一并交給數(shù)據(jù)鏈路層
18、。后者構(gòu)建一個(gè)數(shù)據(jù)幀, 目的地址是 ip 層傳過(guò)來(lái)的物理地址,源地址則是本機(jī)的物理地址,還要附加上 一些控制信息,依據(jù)以太網(wǎng)的介質(zhì)訪問(wèn)規(guī)則,將它們傳送出去。 2. 如果一臺(tái)主機(jī)能 ping 通自己但網(wǎng)絡(luò)不通,可能是什么原因? 答:(1)可能計(jì)算機(jī)的網(wǎng)卡安裝不正確,也可能是沒(méi)連通;(2)計(jì)算機(jī)的 tcp/ip 協(xié)議沒(méi)有與網(wǎng)卡有效的綁定;(3)windows 服務(wù)器的網(wǎng)絡(luò)服務(wù)功能還沒(méi) 啟動(dòng) 3. 考慮 netstat、traceroute、ipconfig 等網(wǎng)絡(luò)測(cè)試應(yīng)用程序的工作原理以 及使用。 答:netstat 的工作原理及使用:(1)顯示本地或與之相連的遠(yuǎn)程機(jī)器的連 接狀態(tài),包括 tcp、
19、ip、udp、icmp 協(xié)議的使用情況,了解本地機(jī)開(kāi)放的端口情 況.(2)檢查網(wǎng)絡(luò)接口是否已正確安裝,如果在用 netstat 這個(gè)命令后仍不能顯 示某些網(wǎng)絡(luò)接口的信息,則說(shuō)明這個(gè)網(wǎng)絡(luò)接口沒(méi)有正確連接,需要重新查找原 因。(3)通過(guò)加入“-r”參數(shù)查詢與本機(jī)相連的路由器地址分配情況。(4)檢查 一些常見(jiàn)的木馬等黑客程序,因?yàn)槿魏魏诳统绦蚨夹枰ㄟ^(guò)打開(kāi)一個(gè)端口來(lái)達(dá) 到與其服務(wù)器進(jìn)行通信的目的。 traceroute 程序的設(shè)計(jì)是利用 icmp 及 ip header 的 ttl(time to live) 。 首先,traceroute 送出一個(gè) ttl 是 1 的 ip 數(shù)據(jù)報(bào)到目的地,當(dāng)路徑
20、上的第一 個(gè)路由器(router)收到這個(gè)數(shù)據(jù)報(bào)時(shí),它將 ttl 減 1。此時(shí),ttl 變?yōu)?0 了, 所以該路由器會(huì)將此數(shù)據(jù)報(bào)丟掉,并送回一個(gè)icmp time exceeded消息, traceroute 收到這個(gè)消息后,便知道這個(gè)路由器存在于這個(gè)路徑上,接著 traceroute 再送出另一個(gè) ttl 是 2 的 datagram,發(fā)現(xiàn)第 2 個(gè)路由器. traceroute 每次將送出的數(shù)據(jù)報(bào)的 ttl 加 1 來(lái)發(fā)現(xiàn)另一個(gè)路由器,這個(gè)重復(fù) 的動(dòng)作一直持續(xù)到某個(gè)數(shù)據(jù)報(bào)抵達(dá)目的地。當(dāng)數(shù)據(jù)報(bào)到達(dá)目的地后,該主機(jī)并 不會(huì)送回 icmp time exceeded 消息,因?yàn)樗咽悄康牡亓恕?
21、ipconfig 的工作原理及使用: (1)查找目標(biāo)主機(jī)的 ip 地址及其它有關(guān) tcp/ip 協(xié)議的信息。(2)當(dāng)用戶的網(wǎng)絡(luò)中設(shè)置的是 dhcp(動(dòng)態(tài) ip 地址配置協(xié)議) 15 時(shí),利用 ipconfig/winipcfg 可以讓用戶很方便地了解到所用 ipconfig/winipcfg 機(jī)的 ip 地址的實(shí)際配置情況。因?yàn)樗幸粋€(gè)“/all”這個(gè) 參數(shù),所以它可偵查到本機(jī)上所有網(wǎng)絡(luò)適配的 ip 地址分配情況,比 ping 命令 更為詳細(xì)。如果我們一臺(tái) ip 地址為 99 上運(yùn)行”ipconfig”命令后, 窗口中顯示了主機(jī)名、dns 服務(wù)器、節(jié)點(diǎn)類(lèi)型以及主機(jī)的相關(guān)信
22、息如網(wǎng)卡類(lèi)型、 mac 地址、ip 地址、子網(wǎng)掩碼以及默認(rèn)網(wǎng)關(guān)等。其中網(wǎng)絡(luò)適配器的 mac 地址在 檢測(cè)網(wǎng)絡(luò)錯(cuò)誤時(shí)非常有用。 配置不正確的 ip 地址或子網(wǎng)掩碼是接口配置的常 見(jiàn)故障。其中配置不正確的 ip 地址有兩種情情況: (1)網(wǎng)號(hào)部分不正確。此時(shí) 執(zhí)行每一條 ipconfig 命令都會(huì)顯示“no answer” ,這樣,執(zhí)行該命令后錯(cuò)誤的 ip 地址就能被發(fā)現(xiàn),修改即可。(2)主機(jī)部分不正確。如與另一主機(jī)配置的地 址相同而引起沖突。這種故障是當(dāng)兩臺(tái)主機(jī)同時(shí)配置相同的 ip 地址時(shí)出現(xiàn)的間 歇性的通信問(wèn)題。更換 ip 地址中的主機(jī)號(hào)部分,該問(wèn)題即能排除。 6 心得體會(huì)心得體會(huì) 通過(guò)仔細(xì)閱
23、讀程序代碼,查找相關(guān)資料,我大概弄懂了程序的基本過(guò)程。 程序通過(guò)發(fā)送一個(gè) icmp 回顯請(qǐng)求報(bào)文到目的地主機(jī),如果有 ip 選項(xiàng)途中的主 機(jī)通過(guò)報(bào)文記錄各自的 ip 地址,目的地主機(jī)回發(fā)一個(gè)回顯應(yīng)答報(bào)文,然后發(fā)送 主機(jī)通過(guò)解析回顯應(yīng)答報(bào)文,查看通過(guò)路由地址,并計(jì)算發(fā)送回收?qǐng)?bào)文所用的 傳送時(shí)間,以確定回顯報(bào)文是否超時(shí)。 在學(xué)習(xí)的過(guò)程中發(fā)現(xiàn)程序良好的算法和優(yōu)良的編程思想的同時(shí)我也發(fā)現(xiàn)很 多是我沒(méi)見(jiàn)過(guò)的函數(shù)例如 wsastartup(makeword(2, 2), if(createsocket()=-1) afxmessagebox(創(chuàng)建套接字失敗! ); if(connectprocess()=
24、-1) afxmessagebox(連接失??!); /連接監(jiān)聽(tīng),判斷用戶命令,調(diào)用相關(guān)函數(shù) dword cnetserverdlg:connectprocess() addrlen=sizeof(sockaddr_in); if(listen(sock,3)0) /調(diào)用 listen 來(lái)偵聽(tīng)客戶的連接請(qǐng)求 afxmessagebox(偵聽(tīng)失??!); return(-1); for(;)/accept ()用來(lái)接受參數(shù) s 的 socket 連線 sock1=accept(sock,(struct sockaddr far *) for(;) memset(rbuff,0,1024); mems
25、et(sbuff,0,1024); if(recv(sock1,rbuff,1024,0)0) fwrite(rbuff,sizeof(char),count,fd);/寫(xiě)入本地 fclose(fd); closesocket(sock1); /for 2 /for 1 24 3.1.2 執(zhí)行命令及調(diào)用的函數(shù) /逐級(jí)尋找目錄 int cnetserverdlg:sendfilelist(socket datatcps) handle hff; win32_find_data fd; /搜索文件 hff=findfirstfile(*,/該函數(shù)到一個(gè)文 件夾(包括子文件夾)去搜索指定文件 if(
26、hff=invalid_handle_value)/發(fā)生 錯(cuò)誤-如果調(diào)用成功返回一個(gè)非 0 值 const char *errstr=cant list files!n; if(send(datatcps,errstr,strlen(errstr),0)=socke t_error) afxmessagebox(傳送失??!); closesocket(datatcps); return 0; bool fmorefiles=true; while(fmorefiles) /發(fā)送此項(xiàng)文件信息 if(!sendfilerecord(datatcps, return 0; /搜索下一個(gè)文件 fmor
27、efiles=findnextfile(hff,/繼續(xù)查找 findfirstfile 函數(shù)搜索后的文件 closesocket(datatcps); return 1; /建目錄信息格式化發(fā)送 int cnetserverdlg:sendfilerecord(socket datatcps,win32_find_data *pfd) /ftp 初始化,創(chuàng)建一個(gè)偵聽(tīng)套接字, win32_find_data 文件的全部屬性信息 char n=*; char buffer1024; char filerecordmax_path+32; filetime ft; filetimetolocalfi
28、letime( /將 utc 文件時(shí)間轉(zhuǎn)換成本地文件時(shí)間 systemtime lastwtime; filetimetosystemtime( /根據(jù)一個(gè) filetime 結(jié)構(gòu)的內(nèi)容,裝載一個(gè) systemtime 結(jié)構(gòu) char*dir=pfd- dwfileattributes sprintf(filerecord,%-20s %10d %04d- %02d-%02d %02d:%02dn , /%5s pfd-cfilename,/ 文件名 pfd-nfilesizelow, /nfilesizelow; 文 件長(zhǎng)度低 32 位 lastwtime.wyear, lastwtime.
29、wmonth, lastwtime.wday, lastwtime.whour, lastwtime.wminute ); if(send(datatcps,filerecord,strlen(filerecord),0) =socket_error) afxmessagebox(傳送列表出錯(cuò)); return 0; recv(datatcps,buffer,1024,0); return 1; 25 /提取遠(yuǎn)方路徑 int cnetserverdlg:pwd(socket datatcps) system(cd tmp.txt);/調(diào)用系統(tǒng)命令 file *fin; fin=fopen(tm
30、p.txt,r+);/獲取路徑 char temp_buffer160; while (fgets(temp_buffer,80,fin)!=null) temp_bufferstrlen(temp_buffer)- 1=0; /目錄判定 if(filename0!=0) sprintf(sbuff,%s%s,temp_buffer,filename ); else sprintf(sbuff,%s,temp_buffer); send(datatcps, sbuff, strlen(sbuff), 0); /格式發(fā)送 fclose(fin); system(del tmp.txt); clo
31、sesocket(datatcps); return 0; /發(fā)送文件函數(shù) int cnetserverdlg:sendfile(socket datatcps,file* file) for(;) /從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端 int r=fread(sbuff,1,1024,file);/從一個(gè)流中 讀數(shù)據(jù) if(send(datatcps,sbuff,r,0)=socket_err or) afxmessagebox(斷開(kāi)連接!); /失去與客戶 端的連接 closesocket(datatcps); return 0; if(r0) fwrite(rbuff,sizeof(cha
32、r),count,fd); /調(diào)用 fwrite 寫(xiě)內(nèi)容到流中,rbuff 地址的數(shù)據(jù)- fd 文件指針的目錄 fclose(fd); /關(guān)閉一個(gè)流 afxmessagebox(下載完成!); /get 28 3.2.3 客戶端上傳代碼 void cnetftpdlg:onput() . browseinfo binfo; zeromemory(/置零 binfo.hwndowner = this-m_hwnd; lpitemidlist lpdlist; /用來(lái)保存返回信息 binfo.lpsztitle = 請(qǐng)選擇要共享的文件夾: ; binfo.ulflags=bif_browseinc
33、ludefiles; lpdlist = shbrowseforfolder( /顯示選擇對(duì)話框 if(lpdlist != null) /用戶按了確定按鈕 tchar chpath255; shgetpathfromidlist(lpdlist, chpath);/把 項(xiàng)目標(biāo)識(shí)列表轉(zhuǎn)化成字符 strcpy(messge2,chpath); else return; strcat(order,messge1); strcat(order, ); strcat(order,messge2); sprintf(buff,order);/將 order 輸出到 buff 里 tcpsend(buff
34、);/調(diào)用發(fā)送命令 recv(sock,rbuff,1024,0); if(strncmp(rbuff,put,3)=0) strcpy(filename,rbuff+9); fd2=fopen(filename,rb);/rb 只允許讀數(shù)據(jù) if(fd2) if(!sendfile(sock,fd2)/調(diào)用發(fā)送文件函數(shù) afxmessagebox(上傳失?。?; fclose(fd2); /put /發(fā)送文件函數(shù) int cnetftpdlg:sendfile(socket datatcps,file* file) for(;)/從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端 int r=fread(sb
35、uff,1,1024,file);/參數(shù):用于接收數(shù) 據(jù)的地址(指針) (ptr) ;單個(gè)元素的大小 (size) ;元素個(gè)數(shù)(nitems) ;提供數(shù)據(jù)的文件 指針(stream)返回值:成功讀取的元素個(gè)數(shù) if(send(datatcps,sbuff,r,0)=socket_error) afxmessagebox(失去連接!); closesocket(datatcps); return 0; if(rsendframe( t ) ) /接收方成功接收一個(gè)幀 if ( reciever-recieveframe( t ) ) /發(fā)送方接收一個(gè)確認(rèn) sender-recieveack( )
36、; return true; return false; /*函數(shù)名:do 功 能:執(zhí)行程序需要功能*/ bool do( ) cout sendersize senderwindowsize; /初始化出錯(cuò)幀序號(hào)數(shù)組 cout wrongsize; int *wrong= new intwrongsize + 1; *(wrong + wrongsize)= 0; if ( wrongsize ) cout n 輸入出錯(cuò)幀序號(hào):; for ( int i= 0; i *(wrong + i); /建立傳輸系統(tǒng) gobackn *go_back_n= new gobackn( sendersi
37、ze, senderwindowsize, wrong ); delete wrong; /開(kāi)始傳輸 system( pause ); system( cls ); cout finished( ); ) go_back_n-transferframe( ); /傳輸完畢,關(guān)閉程序 cout n 傳輸完畢。 endl; delete go_back_n; cout inputcontinue; system( cls ); if ( inputcontinue = y | inputcontinue = y ) return true; return false; 2.選擇重發(fā): 41 /簡(jiǎn)化
38、幀 struct frame int sequence;/幀序號(hào) bool checksum;/校驗(yàn)和,true代表正常 ; /簡(jiǎn)化確認(rèn)或重傳要求幀 struct ack_nak int sequence;/幀序號(hào) bool flag;/標(biāo)志,true代表這個(gè)是確認(rèn) ; selectrepeat:selectrepeat( int amount, int senderwindowsize, int *wrong, int recieverwindowsize ) . /初始化信道延時(shí),用填充幀序號(hào)為負(fù)數(shù)實(shí)現(xiàn) for ( int i= 0; i enterqueue( t ); ack_nak
39、s; s.sequence= -1; ack_nakchannel-enterqueue( s ); /* 函數(shù)名:selectrepeat:transfer 參數(shù)表: 功 能:循環(huán)傳輸幀、確認(rèn)或者重傳要求,直 到發(fā)送方所有幀都得到確認(rèn)為止 */ void selectrepeat:transfer( ) for ( ; !sender-finished( ); ) selectrepeat:senderdo( ); selectrepeat:recieverdo( ); /* 函數(shù)名:selectrepeat:senderdo 參數(shù)表: 功 能:如果信道不滿,發(fā)送方發(fā)送一個(gè)幀; 如果有確認(rèn)或
40、重傳要求,發(fā)送方接收一個(gè)確認(rèn) 或重傳要求 */ void selectrepeat:senderdo( ) /發(fā)送幀 frame t; if ( !sender-sendframe( t ) ) t.sequence= -1; channel-enterqueue( t ); /取確認(rèn)或者重傳要求 ack_nak s; ack_nakchannel-quitqueue( s ); sender-recieveack_nak( s ); 42 /* 函數(shù)名:selectrepeat:recieverdo 參數(shù)表: 功 能:如果信道不空,接收方接收一個(gè)幀; 如果確認(rèn)或重傳要求的信道不滿,接收方發(fā)送
41、 一個(gè)確認(rèn)或重傳要求 */ void selectrepeat:recieverdo( ) /接收幀 frame t; channel-quitqueue( t ); ack_nak s; switch ( reciever-recieveframe( t ) ) /按順序接收幀,返回確認(rèn) case 1: reciever-sendack( s ); break; /幀檢驗(yàn)錯(cuò)誤或者緩存滿,返回重傳要求 case 0: reciever-sendnak( s ); break; /由于之前有丟幀,返回填充幀用于延時(shí) case -1: s.sequence= -1; break; default:
42、 break; ack_nakchannel-enterqueue( s ); /* 函數(shù)名:do 參數(shù)表: 功 能:執(zhí)行程序需要功能 */ bool do( ) cout sendersize senderwindowsizerecieverwindowsize; /初始化出錯(cuò)幀序號(hào)數(shù)組 cout *wrong; system( pause ); system( cls ); /建立傳輸系統(tǒng),開(kāi)始傳輸 selectrepeat *select_repeat= new selectrepeat( sendersize, senderwindowsize, wrong, recieverwindowsize ); delete wrong; select_repeat-transfer( ); /傳輸完畢,關(guān)閉程序 cout n 傳輸完畢。 endl; delete select_repeat; cout inputcontinue; system( cls ); if ( inputcontinue = y | inp
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合同模板中央空調(diào)銷(xiāo)售合同范本
- 北京億歐網(wǎng)盟科技有限公司-新質(zhì)生產(chǎn)力系列:2025中國(guó)消費(fèi)級(jí)AI硬件價(jià)值洞察及GEEK50榜單報(bào)告
- 2024年三年級(jí)道德與法治下冊(cè) 第四單元 多樣的交通和通信 11四通八達(dá)的交通第二課時(shí)說(shuō)課稿 新人教版
- 2024年秋七年級(jí)地理上冊(cè) 第五章 世界的發(fā)展差異 5.2《國(guó)際經(jīng)濟(jì)合作》說(shuō)課稿2 (新版)湘教版
- 9 古代科技 耀我中華(說(shuō)課稿)2024-2025學(xué)年統(tǒng)編版道德與法治五年級(jí)上冊(cè)
- 養(yǎng)殖設(shè)備銷(xiāo)售合同范例
- 2024年一年級(jí)道德與法治上冊(cè) 第16課 我有一雙明亮的眼睛說(shuō)課稿 未來(lái)版
- 9 種豆子 說(shuō)課稿-2023-2024學(xué)年科學(xué)二年級(jí)下冊(cè)冀人版
- 出售電廠鍋爐合同范例
- 人員轉(zhuǎn)公司合同范例
- 投標(biāo)廢標(biāo)培訓(xùn)
- 腦卒中課件完整版本
- 藥房保潔流程規(guī)范
- 電子信息工程基礎(chǔ)知識(shí)單選題100道及答案解析
- 血液透析器課件
- 吊車(chē)司機(jī)雇傭合同協(xié)議書(shū)
- 新華師大版八年級(jí)下冊(cè)初中數(shù)學(xué)全冊(cè)課時(shí)練(課后作業(yè)設(shè)計(jì))
- 致命性大出血急救專(zhuān)家共識(shí)
- 住院成人高血糖患者血糖監(jiān)測(cè)醫(yī)護(hù)協(xié)議處方共識(shí)
- JTS-169-2017碼頭附屬設(shè)施技術(shù)規(guī)范
- DL-T5816-2020分布式電化學(xué)儲(chǔ)能系統(tǒng)接入配電網(wǎng)設(shè)計(jì)規(guī)范
評(píng)論
0/150
提交評(píng)論