版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機網(wǎng)絡(luò)課程設(shè)計報告課 程 計算機網(wǎng)絡(luò)課程設(shè)計 實驗名稱1 _ping程序設(shè)計_實驗名稱2 文件傳輸協(xié)議的簡單設(shè)計與實現(xiàn)_專業(yè)班級 姓 名 學(xué) 號 同組人姓名 _ 2008 年 12 月 28 日目錄一ping 1.實驗?zāi)康暮鸵?32.實驗環(huán)境 43.程序的實現(xiàn)方法和方案 53.1ping原理 53.2.設(shè)計方案 53.3設(shè)計流程圖 64. 程序源代碼 95.實驗數(shù)據(jù)、結(jié)果分析 126.思考題 127.心得體會 13二FTP1FTP實驗內(nèi)容、目的 14 1.1流程圖 16 1.2服務(wù)端·. 17 1.3客戶端·232 實驗數(shù)據(jù)、結(jié)果分析··.293
2、思考題· 314 心得體會· . 32三 參考文獻.33廣東工業(yè)大學(xué)本科生課程設(shè)計任務(wù)書題目名稱PING程序設(shè)計學(xué) 院自動化專業(yè)班級姓 名學(xué) 號一、實驗?zāi)康暮鸵髮嶒災(zāi)康? PING程序是我們使用的比較多的用于測試網(wǎng)絡(luò)連通性的程序。PING程序基于ICMP,使用ICMP的回送請求和回送應(yīng)答來工作。由計算機網(wǎng)絡(luò)課程知道,ICMP是基于IP的一個協(xié)議,ICMP包通過IP的封裝之后傳遞。課程設(shè)計中選取PING程序的設(shè)計,其目的是希望同學(xué)們通過PING程序的設(shè)計,能初步掌握TCP/IP網(wǎng)絡(luò)協(xié)議的基本實現(xiàn)方法,對網(wǎng)絡(luò)的實現(xiàn)機制有進一步的認識。實驗內(nèi)容和要求:1、RAW模式的SOCKE
3、T編程PING程序是面向用戶的應(yīng)用程序,該程序使用ICMP的封裝機制,通過IP協(xié)議來工作。為了實現(xiàn)直接對IP和ICMP包進行操作,實驗中使用RAW模式的SOCKET編程。熟悉SOCKET的編程,包括基本的系統(tǒng)調(diào)用如SOCKET、BIND等;2、具體內(nèi)容1. 定義數(shù)據(jù)結(jié)構(gòu)需要定義好IP數(shù)據(jù)報、ICMP包等相關(guān)的數(shù)據(jù)結(jié)構(gòu);2. 程序?qū)崿F(xiàn)在WINDOWS環(huán)境下實現(xiàn)PING程序;3. 程序要求在命令提示符下輸入: PING .其中為目的主機的IP地址,不要求支持域名,對是否帶有開關(guān)變量也不做要求。不帶開關(guān)變量時,要求返回4次響應(yīng)。返回信息的格式: REPLY FROM .或 REQUEST TimeO
4、ut (無法PING通的情況)。二、實驗環(huán)境Pc機一臺(可以與其他機聯(lián)通或者可以上網(wǎng))操作系統(tǒng)為windows xp軟件為vc6.0Windows 環(huán)境下三、實驗方法、步驟及結(jié)構(gòu)測試實驗按下述步驟進行:1) 熟悉IP以及ICMP協(xié)議的工作機制2) 熟悉RAW模式的SOCKET編程3) 編寫PING的實現(xiàn)程序4) 編譯環(huán)境中需要包括SOCKET庫 WS2_32.lib5) 在模擬實現(xiàn)環(huán)境下調(diào)試并運行自己編寫的PING程序6) 保留你實現(xiàn)的程序在你的用戶目錄下,以備輔導(dǎo)教師檢查7) 最后提交源程序,撰寫實驗報告四、課程設(shè)計(論文)進程安排序號設(shè)計(論文)各階段內(nèi)容地點起止日期1了解實驗內(nèi)容,查找資
5、料 實驗室,圖書館12.222查找資料,了解各個函數(shù)的內(nèi)容圖書館宿舍12.233調(diào)試,解決各段函數(shù)的錯誤,實現(xiàn)各項功能宿舍12.244小組交流,交換各自意見宿舍12.255答辯實驗室12.266完成設(shè)計報告,并加深對設(shè)計的了解宿舍12.27五、應(yīng)收集的資料及主要參考文獻1程良倫,網(wǎng)絡(luò)工程概論,機械工業(yè)出版社,20072張越 等,Visual C+網(wǎng)絡(luò)程序設(shè)計實例詳解,人民郵電出版社,20063Andrew S Tanenbaum 著 潘愛民 譯 ,計算機網(wǎng)絡(luò)(第四版),清華大學(xué)出版社,20044謝希仁,計算機網(wǎng)絡(luò)(第四版),電子工業(yè)大學(xué),20065 王宏C編程設(shè)計方案教程清華大學(xué)出版社:200
6、2: 6 夏華香C#編程技巧具體案例解析中國電力出版社:2005:發(fā)出任務(wù)書日期:2008年 月 日 指導(dǎo)教師簽名:計劃完成日期: 2008年 月 日基層教學(xué)單位責任人簽章:主管院長簽章:一、 ping的實現(xiàn)方法和方案: 1.1 ping的原理: Ping命令不僅存在Windows系統(tǒng)上,在Unix系統(tǒng)上也有Ping命令,其實對其他只要是支持網(wǎng)絡(luò)的操作系統(tǒng),一般也都存在該命令。Ping命令的主要作用是檢測網(wǎng)絡(luò)上主機的狀態(tài)。要是在幾年前,我們還可以下如此斷言,如果不能Ping通某臺主機,那么也就無法Telnet或者FTP到這臺主機,但隨著互聯(lián)網(wǎng)的安全意識的增加,出現(xiàn)了訪問控制清單的路由器和防火墻
7、,由于ICMP報文是在IP數(shù)據(jù)包中被傳輸?shù)模竭_一臺主機不僅取決于IP層是否到達,還取決于使用何種協(xié)議和端口。譬如金山公司的金山網(wǎng)鏢就可以禁止其他機器Ping通這臺主機。所以在現(xiàn)在的情況下,即時Ping不通某臺機器,但也有可能FTP登陸到這臺機器,或者通過HTTP來瀏覽這臺機器上的Web頁面 定義IP數(shù)據(jù)報、ICMP包等相關(guān)的數(shù)據(jù)結(jié)構(gòu)如下: / IP 頭結(jié)構(gòu)typedef struct iphdr unsigned int h_len:4; / 首部長度 unsigned int version:4; / IP版本 unsigned char tos; / 服務(wù)類型 unsigned sho
8、rt total_len; / 包總長度 unsigned short ident; /標識符 unsigned short frag_and_flags; / 標志 unsigned char ttl;/ 生存周期 unsigned char proto; / protocol (TCP, UDP etc) 協(xié)議類型 unsigned short checksum; /IP檢驗和 unsigned int sourceIP;/源地址IP unsigned int destIP;/目的地址IPIpHeader;/ ICMP 頭結(jié)構(gòu)typedef struct icmphdr BYTE i_ty
9、pe;/類型 BYTE i_code; / 代碼類型 USHORT i_cksum;/檢驗和 USHORT i_id;/地址 USHORT i_seq;/發(fā)送順序 /* This is not the std header, but we reserve space for time */ ULONG timestamp;/接受時間IcmpHeader;1.2設(shè)計方案: ping-n count -r count-n count 發(fā)送 count 指定的 ECHO 數(shù)據(jù)包數(shù)。默認值為 4。 -r count 在"記錄路由"字段中記錄傳出和返回數(shù)據(jù)包的路由。count 可以指
10、定最少 1 臺,最多 9 臺計算機。 Ping的返回信息有"Request Timed Out"、"Destination Net Unreachable"和"Bad IP address"還有"Source quench received"。 "Request Timed Out"這個信息表示對方主機可以到達到TIME OUT,這種情況通常是為對方拒絕接收你發(fā)給它的數(shù)據(jù)包造成數(shù)據(jù)包丟失。大多數(shù)的原因可能是對方裝有防火墻或已下線。 "Destination Net Unreachabl
11、e"這個信息表示對方主機不存在或者沒有跟對方建立連接。這里要說明一下"destination host unreachable"和"time out"的區(qū)別,如果所經(jīng)過的路由器的路由表中具有到達目標的路由,而目標因為其它原因不可到達,這時候會出現(xiàn)"time out",如果路由表中連到達目標的路由都沒有,那就會出現(xiàn)"destination host unreachable"。 "Bad IP address" 這個信息表示你可能沒有連接到DNS服務(wù)器所以無法解析這個IP地址,也可能是IP
12、地址不存在。 "Source quench received"信息比較特殊,它出現(xiàn)的機率很少。它表示對方或中途的服務(wù)器繁忙無法回應(yīng)。 開始結(jié)束i<argc?if(*)switch()bRecordRoute=trueusage(*)if(*)datasize=atoi(argvi)ipdest=argvi1.3程序?qū)崿F(xiàn)流程圖如下: rdefault成立成立 否成立否否圖(ValidateArgs)開始i<ptr/4?If(host)?Inaddr,h_nameinaddr結(jié)束成立不成立 成立不成立開始Iphdrlen&&!icmpcountDec
13、odeIPoptions()bytes<iphdrlen+ICMP_MIN_Too few bytes from*I_type !=EC*PLYnonecho type*recvdIf(id*)Someone else*結(jié)束圖(DecodeIPoptions) 成立 成立 成立 成立圖(DecodeICMPHeader)結(jié)束發(fā)送報文打印失敗信息結(jié)束函數(shù)求檢驗和接收報文解析報文打印失敗信息結(jié)束函數(shù)設(shè)置接收和發(fā)送時限開始創(chuàng)建套接字創(chuàng)建輸入接口判斷是否有IP選項打印失敗信息結(jié)束函數(shù)驗證輸入ValidateArgs()創(chuàng)建一個IP選項接口打印失敗信息結(jié)束函數(shù)打印失敗信息結(jié)束函數(shù) 獲取主機信息填寫
14、ICMP報文打印失敗信息結(jié)束函數(shù) 否 是 否是否 否是否 是 否是 否是 否是未發(fā)送四次完成圖(main)二、程序源代碼主函數(shù)代碼:/主函數(shù)/ 設(shè)置產(chǎn)生ICMP報文,增加可以選擇的IP選項首部/ 發(fā)送ICMP回顯請求報文到目的主機,并且為每個/ 報文設(shè)置一個生存時間,以防止我們不能接受到/ 回顯應(yīng)答報文,當收到一個回顯應(yīng)答報文時檢測代碼 int main(int argc, char *argv)char *icmp_data = NULL;/設(shè)置ICMP包數(shù)據(jù)為空char *recvbuf = NULL;/創(chuàng)建接受緩存并賦值USHORT seq_no = 0;/設(shè)置接收順序編號struct
15、sockaddr_in dest = '0'/設(shè)置目的地址為空struct sockaddr_in from= '0'/設(shè)置發(fā)送地址為空struct hostent *hp = NULL;/設(shè)置首部為空int bread = 0;int ret = 0;int fromlen = sizeof(from);/計算發(fā)送包的長度int timeout = 1000;/設(shè)置生存時間unsigned int addr = 0;WSADATA wsaData;/創(chuàng)建一個網(wǎng)絡(luò)編程套接字SOCKET sockRaw = INVALID_SOCKET;/設(shè)置初始套接字為空IpO
16、ptionHeader ipopt = '0'/設(shè)置IP選項首部為空if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)/判斷是否成功創(chuàng)建版本2.2的網(wǎng)絡(luò)套接字printf("WSAStartup() failed: %dn", GetLastError();/打印創(chuàng)建錯誤信息return 2;ValidateArgs(argc, argv);/調(diào)用驗證IP選項首部函數(shù)sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);/創(chuàng)建發(fā)送套接字if (sockRaw =
17、INVALID_SOCKET)/判斷是否發(fā)送成功printf("WSASocket() failed: %dn", WSAGetLastError();/打印失敗信息return 3;if (bRecordRoute)/判斷是否有記錄IP路由的選項ZeroMemory(&ipopt, sizeof(ipopt);/開辟一個sizeof(ipopt)長度的內(nèi)存ipopt.code = IP_RECORD_ROUTE; / 設(shè)置記錄路由選項值ipopt.ptr = 4; / 指到第一個記錄填寫IP地址的位置ipopt.len = 39; /IP選項首部程度 ret =
18、setsockopt(sockRaw, IPPROTO_IP, IP_OPTIONS,(char *)&ipopt, sizeof(ipopt); /設(shè)置套接字選項if (ret = SOCKET_ERROR)/判斷是否成功創(chuàng)建套接字printf("setsockopt(IP_OPTIONS) failed: %dn",/打印失敗信息WSAGetLastError();bread = setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(timeout); /設(shè)置一個接收的設(shè)置
19、生存周期的套接字if(bread = SOCKET_ERROR)/判斷套接字是否創(chuàng)建成功printf("setsockopt(SO_RCVTIMEO) failed: %dn",WSAGetLastError();/打印錯誤信息return -1;timeout = 1000;bread = setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO,(char*)&timeout, sizeof(timeout); /設(shè)置一個發(fā)送時限的套接字if (bread = SOCKET_ERROR)/判斷創(chuàng)建是否成功printf("s
20、etsockopt(SO_SNDTIMEO) failed: %dn",WSAGetLastError();return -1;memset(&dest, 0, sizeof(dest);/創(chuàng)建一個sizeof(dest)的內(nèi)存空間dest.sin_family = AF_INET;/設(shè)置發(fā)送主機系統(tǒng)的發(fā)送套接字if (dest.sin_addr.s_addr = inet_addr(lpdest) = INADDR_NONE)/把當前地址賦值給發(fā)送地址if (hp = gethostbyname(lpdest) != NULL)/gethostbyname返回一個指向hos
21、tent數(shù)據(jù)結(jié)構(gòu)的指針:memcpy(&(dest.sin_addr), hp->h_addr, hp->h_length);/創(chuàng)建首部長度的內(nèi)存存儲發(fā)送地址dest.sin_family = hp->h_addrtype;/設(shè)置系統(tǒng)主機系統(tǒng)套接字printf("dest.sin_addr = %sn", inet_ntoa(dest.sin_addr);/打印發(fā)送地址elseprintf("gethostbyname() failed: %dn",WSAGetLastError();/打印失敗信息return -1;/ Cre
22、ate the ICMP packet/datasize += sizeof(IcmpHeader);icmp_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET); /為icmp_data分配內(nèi)存recvbuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET); /為recvbuf分配內(nèi)存if (!icmp_data)/判斷分配內(nèi)存是否成功printf("HeapAlloc() failed: %dn", GetLastErro
23、r();/打印失敗信息return -1;memset(icmp_data,0,MAX_PACKET);/把icmp_data內(nèi)存清空FillICMPData(icmp_data,datasize);/調(diào)用函數(shù)填寫ICMP包數(shù)據(jù)while(1)/用循環(huán)控制發(fā)送數(shù)量static int nCount = 0;/設(shè)置靜態(tài)變量,記錄發(fā)送報文的數(shù)量int bwrote;if (nCount+ = 4)/判斷是否已經(jīng)發(fā)送了4個報文,是的話退出整個循環(huán)break;(IcmpHeader*)icmp_data)->i_cksum = 0;/先把ICMP的檢驗和置零(IcmpHeader*)icmp_d
24、ata)->timestamp = GetTickCount();/獲取當前時間(IcmpHeader*)icmp_data)->i_seq = seq_no+;/發(fā)送順序加一(IcmpHeader*)icmp_data)->i_cksum =checksum(USHORT*)icmp_data, datasize); /計算檢驗和bwrote = sendto(sockRaw, icmp_data, datasize, 0,(struct sockaddr*)&dest, sizeof(dest); 創(chuàng)建發(fā)送套接字if (bwrote = SOCKET_ERROR)
25、/判斷錯誤if (WSAGetLastError() = WSAETIMEDOUT)printf("timed outn");/判斷超時錯誤continue;printf("sendto() failed: %dn", WSAGetLastError();/判斷發(fā)送失敗錯誤return -1;if (bwrote < datasize)/比較發(fā)送數(shù)據(jù)報的大小printf("Wrote %d bytesn", bwrote);/打印發(fā)送數(shù)據(jù)報的大小bread = recvfrom(sockRaw, recvbuf, MAX_PAC
26、KET, 0,(struct sockaddr*)&from, &fromlen); /創(chuàng)建接受套接字if (bread = SOCKET_ERROR)/判斷失敗原因if (WSAGetLastError() = WSAETIMEDOUT)printf("timed outn");/判斷打印超時錯誤continue;printf("recvfrom() failed: %dn", WSAGetLastError();/判斷接收失敗return -1;DecodeICMPHeader(recvbuf, bread, &from);/
27、查看ICMP回顯應(yīng)答報文 打印相關(guān)信息Sleep(1000);/等待1秒重復(fù)發(fā)送ICMP回顯請求報文if (sockRaw != INVALID_SOCKET)closesocket(sockRaw);/判斷套接字進程不為空時關(guān)閉進程HeapFree(GetProcessHeap(), 0, recvbuf);/釋放存放接收信息的內(nèi)存HeapFree(GetProcessHeap(), 0, icmp_data);/釋放icmp_data內(nèi)存WSACleanup();注銷Windows Socketsreturn 0;四、實驗數(shù)據(jù)、結(jié)果分析當ping或者主機的時候 就會默認循
28、環(huán)次數(shù)4次。然后數(shù)據(jù)包大小為32。加上頭文件32總共64個字節(jié)。丟包率為0。可以拓展功能還可以自定義循環(huán)次數(shù)和數(shù)據(jù)大小。五、思考題1. 本題目只要求實現(xiàn)PING的一些簡單功能,在Windows命令行模式下,輸入“Ping”回車,查看PING的所有功能,考慮如何實現(xiàn)這些功能。答:PING的主要功能是用來檢測網(wǎng)絡(luò)的連通情況和分析網(wǎng)絡(luò)速度。使用Ping檢查連通性有五個步驟: 1. 使用ipconfig /all觀察本地網(wǎng)絡(luò)設(shè)置是否正確; 2. Ping , 回送地址Ping回送地址是為了檢查本地的TCP/IP協(xié)議有沒有設(shè)置好; 3. Ping本機IP地址,這樣是為
29、了檢查本機的IP地址是否設(shè)置有誤; 4. Ping本網(wǎng)網(wǎng)關(guān)或本網(wǎng)IP地址,這樣的是為了檢查硬件設(shè)備是否有問題,也可以檢查本機與本地網(wǎng)絡(luò)連接是否正常;(在非局域網(wǎng)中這一步驟可以忽略) 5. Ping遠程IP地址,這主要是檢查本網(wǎng)或本機與外部的連接是否正常。2.如果一臺主機能ping通自己但網(wǎng)絡(luò)不通,可能是什么原因?答:DNS設(shè)置的不對,代理沒有設(shè)置好,IP沒有配置好 ,再或者就是中了病毒,arp病毒, 還有就是有可能有人用了一些網(wǎng)管軟件3.考慮Netstat、Traceroute、ipconfig等網(wǎng)絡(luò)測試應(yīng)用程序的工作原理以及使用。答:netstat命令的功能是顯示網(wǎng)絡(luò)連接、路由表和網(wǎng)絡(luò)接口信
30、息,可以讓用戶得知目前都有哪些網(wǎng)絡(luò)連接正在運作。 該命令的一般格式為: netstat 一般有多個命令。Traceroute最簡單的基本用法是:traceroute hostnameipconfig-當使用IPConfig時不帶任何參數(shù)選項,那么它為每個已經(jīng)配置了的接口顯示IP地址、子網(wǎng)掩碼和缺省網(wǎng)關(guān)值六、心得體會開始接到網(wǎng)絡(luò)編程的課程設(shè)計一點都不懂,再加上要用C語言編程,更不知該從何下手。由于考慮都時間關(guān)系,我們小組4人再分成兩組分別進行,分別開始對兩個設(shè)計的工作。我主要負責的就是ping程序的設(shè)計。在圖書館查找了資料,在網(wǎng)上搜索了許多相關(guān)資料后,才開始對各個函數(shù)的理解。參考了同學(xué)的程序,在
31、對每個函數(shù)與其參數(shù)進行了理解,最后才基本上了解了整個過程,并且可以在此基礎(chǔ)上添加一些功能等。廣東工業(yè)大學(xué)課程設(shè)計任務(wù)書題目名稱文件傳輸協(xié)議的簡單設(shè)計與實現(xiàn)學(xué)生學(xué)院自動化學(xué)院專業(yè)班級網(wǎng)絡(luò)工程3班姓 名學(xué) 號一、 實驗?zāi)康奈募魉褪歉鞣N計算機網(wǎng)絡(luò)都實現(xiàn)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議按照客戶/服務(wù)器的模式進行工作,提供交互式的訪問,是INTERNET使用最廣泛的協(xié)議之一。本實驗的目的是,學(xué)會利用已有網(wǎng)絡(luò)環(huán)境設(shè)計并實現(xiàn)簡單應(yīng)用層協(xié)議,掌握TCP/IP 網(wǎng)絡(luò)應(yīng)用程序基本的設(shè)計方法和實現(xiàn)技巧。二、 實驗內(nèi)容和要求1、實驗內(nèi)容我們的計算機網(wǎng)絡(luò)實驗環(huán)境建立在TCP/IP 網(wǎng)絡(luò)體系結(jié)構(gòu)之上。各
32、計算機除了安裝TCP/IP 軟件外,還安裝了TCP/IP 開發(fā)系統(tǒng)。實驗室各計算機具備Windows環(huán)境中套接字socket 的編程接口功能,可為用戶提供全網(wǎng)范圍的進程通信功能。本實驗要求學(xué)生利用這些功能,設(shè)計和實現(xiàn)一個簡單的文件傳送協(xié)議。2、具體要求用socket 編程接口編寫兩個程序,分別為客戶程序(client.c)和服務(wù)器程序(server.c),該程序應(yīng)能實現(xiàn)下述命令功能:get:取遠方的一個文件put:傳給遠方一個文件pwd:顯示遠主當前目錄dir:列出遠方當前目錄cd :改變遠方當前目錄? :顯示你提供的命令quit :退出返回三、 實驗主要儀器設(shè)備和材料Pc機一臺(可以與其他機
33、聯(lián)通或者可以上網(wǎng))操作系統(tǒng)為windows xp軟件為vc6.0Windows 環(huán)境下四、 實驗方法、步驟及結(jié)構(gòu)測試1) 關(guān)于端口號(假設(shè)用SERV_PORT 來表示)的設(shè)定,原則上2000 至5000都可用,為避免沖突,建議取你學(xué)號后三位數(shù)加上2000,比如學(xué)號為971234,則可定義: #define SERV_PORT 22342) 客戶和服務(wù)程序中要有相應(yīng)的include 文件(參考所給例子程序)3) 有些同學(xué)的server 方程序支持多連接,為了不占用更多的系統(tǒng)資源,并發(fā)連接數(shù)限制在3 個以內(nèi)。4) 最后提交源程序,撰寫實驗報告,在實驗報告中說明設(shè)計的思路。五、 課程設(shè)計進程安排序號
34、設(shè)計(論文)各階段內(nèi)容地點起止日期1了解實驗內(nèi)容,查找資料 實驗室,圖書館12.222查找資料,了解各個函數(shù)的內(nèi)容圖書館宿舍12.233調(diào)試,解決各段函數(shù)的錯誤,實現(xiàn)各項功能宿舍12.244小組交流,交換各自意見宿舍12.255答辯實驗室12.266完成設(shè)計報告,并加深對設(shè)計的了解宿舍12.27六、 應(yīng)收集的資料及主要參考文獻1程良倫,網(wǎng)絡(luò)工程概論,機械工業(yè)出版社,20072張越 等,Visual C+網(wǎng)絡(luò)程序設(shè)計實例詳解,人民郵電出版社,20063Andrew S Tanenbaum 著 潘愛民 譯 ,計算機網(wǎng)絡(luò)(第四版),清華大學(xué)出版社,20044謝希仁,計算機網(wǎng)絡(luò)(第四版),電子工業(yè)大學(xué)
35、,20065 王宏C編程設(shè)計方案教程清華大學(xué)出版社:2002: 6 夏華香C#編程技巧具體案例解析中國電力出版社:2005:發(fā)出任務(wù)書日期:2008年 月 日 指導(dǎo)教師簽名:計劃完成日期: 2008年 月 日基層教學(xué)單位責任人簽章:主管院長簽章:一、 文件傳輸協(xié)議(FTP)的實現(xiàn)原理程序?qū)崿F(xiàn)方法和方案流程圖如下: 服務(wù)端 監(jiān)聽進入循環(huán) socket開始Rc<0建立線程分塊多線程NY打印錯誤信息客戶函數(shù)開始YN關(guān)閉讀取aa<0NN讀取函數(shù)Return -1Y返回文件長度Case0讀信息其他錯誤,關(guān)閉轉(zhuǎn)為文件類型Case2 傳文件 讀文件打開文件并傳輸發(fā)出請求客戶端:發(fā)送命令服務(wù)器監(jiān)聽
36、返回Case 0Return -1讀信息Case 2發(fā)送等待 服務(wù)器接收信息開啟下載NY記錄文件斷點續(xù)傳第一次傳輸建立線程下載后自動結(jié)束主要函數(shù)說明:服務(wù)器端由于要實現(xiàn)多線程,必須把功能獨立出來,且包裝成線程,首先建一個監(jiān)聽線程,主要負責接入客戶,并啟動另一個客戶線程。具體程序如下:(其中包括一些說明)/包含需要用到的頭文件#include "Winsock.h"#include "windows.h"#include "stdio.h"#include "time.h"#include <iostream.
37、h>#define RECV_PORT 2000#define SEND_PORT 3000#pragma comment(lib, "wsock32.lib")SOCKET sock;char filename20;sockaddr_in ServerAddr;char rbuff1024;char sbuff1024;char IIP20;/處理help命令void help() cout<<"*COMMANDS help*"<<endl <<"*命令*作用*"<<endl &
38、lt;<" ?或者'help'.顯示你提供的所有命令 "<<endl <<" dir.顯示遠方當前目錄的文件 "<<endl <<" cd.改變遠方當前目錄和路徑 "<<endl <<" cd的用法(進入下級目錄): 'cd 路徑名' "<<endl <<" cd的用法(進入上級目錄): 'cd .' "<<endl <<&
39、quot; get.下載(接受)文件 "<<endl <<" get的用法: 'get 文件名' "<<endl <<" put.上傳(發(fā)送)文件 "<<endl <<" put的用法:'put 文件名' "<<endl <<" quit.退出 "<<endl <<"*"<<endl;/處理dir命令void list(SO
40、CKET sockfd) int nRead; while(true) nRead=recv(sock,rbuff,1024,0); if(nRead=SOCKET_ERROR) printf("read response error!n"); exit(1); if(nRead=0)/數(shù)據(jù)讀取結(jié)束 break; /顯示數(shù)據(jù) rbuffnRead='0' printf("%s",rbuff); int SendFile(SOCKET datatcps,FILE* file) printf("sending file data.&
41、quot;); for(;) /從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端 int r=fread(sbuff,1,1024,file); if(send(datatcps,sbuff,r,0)=SOCKET_ERROR) printf("lost thr connection to client!n"); closesocket(datatcps); return 0; if(r<1024)/文件傳送結(jié)束 break; closesocket(datatcps); printf("donen"); return 1;/初始化scoketDWORD Star
42、tSock()WSADATA WSAData;char a20;memset(a,0,20);if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)printf("sock init fail!n");return (-1);if(strncmp(IIP,a,20)=0)printf("請輸入連接的主機號:");scanf("%s",&IIP);ServerAddr.sin_family=AF_INET;ServerAddr.sin_addr.s_addr=inet_addr(IIP);Se
43、rverAddr.sin_port=htons(RECV_PORT);return(1);/創(chuàng)建套接字DWORD CreateSocket()sock=socket(AF_INET,SOCK_STREAM,0);if(sock=SOCKET_ERROR)printf("sock create fail! n");WSACleanup();return(-1);return(1);/發(fā)送連接請求DWORD CallServer() CreateSocket();if (connect(sock,(struct sockaddr *)&ServerAddr,sizeof
44、(ServerAddr)=SOCKET_ERROR)printf("Connect fail n");memset(IIP,0,20);return(-1);return(1); /發(fā)送命令DWORD TCPSend(char data) int length;length=send(sock,data,strlen(data),0);if(length<=0)printf("send data error ! n");closesocket(sock);WSACleanup();return(-1);return(1);/主程序int main(
45、)char messge110; char messge220; char order30; order0='0'char buff80;FILE *fd;FILE *fd2;int count;int sin_size=sizeof(ServerAddr);StartSock();if(CallServer()=-1)return main();printf("connect ok! n"); printf("Input order:n");memset(buff,0,80);memset(messge2,0,20);memset(or
46、der,0,30);memset(messge1,0,10);memset(rbuff,0,1024);memset(sbuff,0,1024);scanf("%s",&messge1);if(strncmp(messge1,"get",3)=0)scanf("%s",&messge2);if(strncmp(messge1,"put",3)=0)scanf("%s",&messge2);if(strncmp(messge1,"cd",2)=0) sc
47、anf("%s",&messge2); strcat(order,messge1);strcat(order," ");strcat(order,messge2);sprintf(buff,order);/help和?printf("n");if(strncmp(messge1,"help",4)=0)help();if(strncmp(messge1,"?",1)=0)help();if(strncmp(messge1,"quit",4)=0)closesocket
48、(sock);WSACleanup();return 0;TCPSend(buff); recv(sock,rbuff,1024,0); printf(rbuff);if(strncmp(rbuff,"get",3)=0) fd=fopen(messge2,"wb");/使用二進制方式 if(fd=NULL) printf("open file %s for weite failed!n",messge2); return 0; while(count=recv(sock,rbuff,1024,0)>0) fwrite(rbuf
49、f,sizeof(char),count,fd); fclose(fd);/getif(strncmp(rbuff,"put",3)=0)strcpy(filename,rbuff+9); fd2=fopen(filename,"rb");if(fd2)if(!SendFile(sock,fd2) printf("send failed!");return 0; fclose(fd2);else/打開文件失敗 strcpy(sbuff,"can't open file!n"); if(send(sock,sbuff,1024,0) return 0;/putif(strncmp(rbuff,"dir",3)=0)list(sock);/dirif(strncmp(rbuff,"cd",2)=0)closesocket(sock);WSACleanup();/cdreturn main();/main二、客戶端先連接服務(wù)器,接著發(fā)送命令1
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2024學(xué)年北京育才中學(xué)高三(上)期中化學(xué)試題和答案
- 加強供應(yīng)鏈協(xié)同管理的工作總結(jié)計劃
- 社交媒體營銷的趨勢分析計劃
- 社會責任感與公民意識培養(yǎng)計劃
- 茶葉加工與銷售合資協(xié)議三篇
- 家庭與學(xué)校合作的教育計劃
- 制定業(yè)務(wù)指標的月度方案計劃
- 制定企業(yè)愿景與使命計劃
- 班主任團隊建設(shè)的策略計劃
- 電玩具產(chǎn)業(yè)的黃金時代-投資新機遇及高回報預(yù)期
- 排水管網(wǎng)CCTV檢測作業(yè)流程
- 路管線遷移施工方案
- 心理應(yīng)激與應(yīng)激障礙
- 標準太陽能光譜數(shù)據(jù)
- 高中音樂鑒賞 《舞動心弦-中國舞蹈音樂》
- 12J4-2 《專用門窗》標準圖集
- GB/T 42019-2022基于時間敏感技術(shù)的寬帶工業(yè)總線AUTBUS系統(tǒng)架構(gòu)與通信規(guī)范
- WS/T 83-1996肉毒梭菌食物中毒診斷標準及處理原則
- GB/T 24346-2009紡織品防霉性能的評價
- GB/T 10591-2006高溫/低氣壓試驗箱技術(shù)條件
- 《市場營銷學(xué)》-新產(chǎn)品開發(fā)戰(zhàn)略
評論
0/150
提交評論