




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 計 算 機 網 絡 課 程 設 計 題目名稱:局域網文件傳輸和聊天系統學生學院: 專業班級:學 號:學生姓名:指導教師:2012 年 6 月 21 日 局域網文件傳輸和聊天系統摘要:本課程設計包含了文件傳輸協議的簡單設計與實現和兩人聊天系統的設計與實現。學會利用已有網絡環境設計并實現簡單應用層協議,掌握TCP/IP網絡應用程序基本的設計方法和實現技巧,加深對客戶/服務器的工作模式的認識。初步練習基于TCP/IP網絡編程的基本實現方法和思路,同時進一步熟悉計算機網絡課程中基于IP層協議的工作機制。本設計完全用C語言編寫,其中包括了具體設計任務,基本思路及所涉及的相關理論,設計流程圖,調試過程中
2、出現的問題及相應解決辦法,核心程序,個人體會及建議等。關鍵詞:IP層協議,TCP/IP網絡編程1 具體設計任務計算機網絡實驗環境建立在TCP/IP 網絡體系結構之上。各計算機除了安裝TCP/IP 軟件外,還安裝了TCP/IP 開發系統。實驗室各計算機安裝了VC+6.0,可對C語言進行編譯,可為用戶提供全網范圍的進程通信功能。本實驗要求利用這些功能,設計和實現一個簡單的文件傳送協議和兩人聊天系統。2基本思路及所涉及的相關理論2.1基本思路 設計程序使客戶端連接的時候,服務器將會向客戶端發回一條消息告知它的IP地址,然后關閉連接并繼續接收端口的連接。建立各個命令功能對應的函數,發送請求,等待服務器
3、端的服務。服務器端確認IP地址,獲取主機信息,并對客戶端進行會話,發送回復訊息給客戶端,響應完畢后關閉連接,釋放。2.2 相關理論 文件傳送是各種計算機網絡都實現的基本功能,文件傳送協議是一種最基本的應用層協議按照客戶/服務器的模式進行工作,提供交互式的訪問,是INTERNET使用最廣泛的協議之一。計算機網絡實驗環境建立在TCP/IP 網絡體系結構之上。各計算機除了安裝TCP/IP 軟件外,還安裝了TCP/IP 開發系統。實驗室各計算機具備Windows環境中套接字socket 的編程接口功能,可為用戶提供全網范圍的進程通信功能。本設計利用這些功能,設計和實現一個簡單的文件傳送協議和兩人聊天系
4、統。用C語言可以簡單的實現。3 設計流程圖4 部分截圖5 核心程序 #include <stdio.h>#include <stdlib.h>#include <string.h>#include <Winsock2.h>#include <process.h>#include <time.h>#pragma comment(lib,"Ws2_32")#define M 512000 /每塊傳送文件的大小500k#define portNum 8888 /使用的端口號void LongToChar(lo
5、ng x,char a);/將long型整數轉換成字符串long StrToLong(char str);/將字符串轉換成long型整數void getW_name(char waddr,char wname); /獲取文件名函數void sendFile(SOCKET ss); /服務端發送文件函數int receiveFile(SOCKET sc);/客戶端接收文件函數void chatting_client(SOCKET sc); /客戶端聊天函數void chatting_server(SOCKET s_d); /服務端聊天函數int client(); /客戶端主程序void ser
6、ver(); /服務端主程序void main()system("cls");system("color 0a");puts("n");puts(" *");puts(" * * ");puts(" * 歡·迎·使·用·局·域·網·文·件·發·送·工·具 *");puts(" * * ");puts(" * * ");
7、puts(" * * ");puts(" * 1. 客 戶 端 * ");puts(" * * ");puts(" * 2. 服 務 端 * ");puts(" * * ");puts(" * 3. 結 束 * ");puts(" * * ");puts(" * * ");puts(" * 藍天雄鷹 制作 * ");puts(" * 2012-6-20 * ");puts(" * 藍鷹展
8、翅氣吞天下 * ");puts(" *n");puts("全屏(退出全屏)操作請按:ALT+ENTERn");printf("請輸入你要選擇的端代號(1-3):");char ch;char Num10;gets(Num);ch=Num0;while(ch >='4' | ch <='0')/檢測用戶選擇的代碼是否符合要求printf("n你的輸入有誤!請重新輸入:");gets(Num);ch=Num0;if('1'=ch)client();e
9、lse if('2'=ch)server();else if('3'=ch)exit(0);int client()system("color 0a");/修改DOS窗口顏色,是其成0A。WORD wVersion=MAKEWORD(1,1); WSADATA wsData; int nResult= WSAStartup(wVersion,&wsData); /啟動WINSOCKETif(nResult !=0) printf("啟動Winsock失敗!n"); SOCKET sc=socket(AF_INET,
10、SOCK_STREAM,IPPROTO_IP); /創建套接字if(sc=INVALID_SOCKET) printf("創建套接字失敗!n"); SOCKADDR_IN addrSc;addrSc.sin_family=AF_INET; addrSc.sin_port=htons(portNum); /保證字節順序 char IP20;again:printf("請輸入服務器的IP地址:");gets(IP);if( -1=inet_addr(IP) ) /循環檢測IP地址是否合法printf("IP地址錯誤!n");goto ag
11、ain;addrSc.sin_addr.S_un.S_addr=inet_addr(IP); int b=0;while(b<5) /檢測5次,如果服務器在此時間內啟動,則進行連接nResult=connect(sc,(SOCKADDR*)&addrSc,sizeof(SOCKADDR); /套接字連接Sleep(DWORD)100);/延時1秒if(nResult=SOCKET_ERROR) printf(" %d 次連接失敗!n",b+1);elsebreak;b+;if(nResult=SOCKET_ERROR)printf("登陸超時,請重新
12、登陸!n");goto again;char *buf="連接成功!" /向服務端驗證連接成功nResult=send(sc,buf,strlen(buf)+1,0); if(nResult=SOCKET_ERROR) printf("5.套接字發送數據失敗!n");return 0;char messM;nResult =recv(sc,mess,strlen(mess),0); /接受服務端的連接驗證信息if(nResult = -1 ) /判斷服務端是否關閉printf("n服務端已斷開n");system("
13、;pause");exit(0);printf("%sn",mess);/ 功能菜單及操作 /tianle:system("cls"); /清屏puts("nn");puts(" *");puts(" * * ");puts(" * 歡·迎·使·用·局·域·網·文·件·發·送·工·具 *");puts(" *(客 戶 端) * "
14、;);puts(" * * ");puts(" * * ");puts(" * 請等待服務端的相應操作 * ");puts(" * * ");puts(" * * ");puts(" * 藍天雄鷹 制作 * ");puts(" * 2012-6-20 * ");puts(" * 藍鷹展翅氣吞天下 * ");puts(" *n");puts("全屏(退出全屏)操作請按:ALT+ENTERn");ch
15、ar rMess100;nResult=recv(sc,rMess,strlen(rMess),0); /接收服務端發來的操作請求if(nResult=-1) /判斷服務端是否關閉printf("n服務端已斷開n");system("pause");goto tianle;printf("%sn",rMess);char ch;char str100;gets(str);ch=str0;while( ch!='Y' && ch!='y' && ch!='N'
16、; && ch!='n' ) /處理客戶端的錯誤輸入printf("輸入有誤,請重新輸入(Y/N):");gets(str);ch=str0;send(sc,&ch,sizeof(char),0); /向服務端反饋選擇,并執行相應操作if(strcmp(rMess,"服務端向你傳送文件,是否接受(Y/N):")=0 && (ch='Y' | ch='y') )receiveFile(sc);if(strcmp(rMess,"服務端向你發起聊天,是否接受(Y/
17、N):")=0 && (ch='Y' | ch='y') )chatting_client(sc);if(ch='N' | ch='n')printf("你拒絕了!n");system("pause");system("cls");goto tianle;nResult=closesocket(sc); /關閉套接字if(nResult=SOCKET_ERROR) printf("8.關閉套接字失敗!n");return 0;
18、 void server()system("color 0a");/修改DOS窗口顏色為0AWORD wVersion=MAKEWORD(1,1); WSADATA wsData; int nResult= WSAStartup(wVersion,&wsData); /1、啟動Winsockif(nResult !=0) printf("啟動Winsock失敗!n"); SOCKET s=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); /2.創建套接字if(s=INVALID_SOCKET) printf(&quo
19、t;創建套接字失敗!n"); SOCKADDR_IN addr; addr.sin_family=AF_INET; addr.sin_port=htons(portNum); /保證字節順序 addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);nResult=bind(s,(sockaddr*)&addr,sizeof(sockaddr); /3、套接字的綁定if(nResult=SOCKET_ERROR) printf("套接字的綁定失敗!n"); nResult=listen(s,5); /最多5個連接, 套接字的監
20、聽if(nResult=SOCKET_ERROR) printf("套接字的監聽(服務器端)失敗!n"); SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR);printf("n等待客戶端的連接");int a=0;while(a<5)/開始的一個小動態圖形for(int b=0;b<8;b+)Sleep(100);printf(" . ");Sleep(100);system("cls");printf("nr等待客戶端的連接");a+;
21、while(1)SOCKET s_d=accept(s,(sockaddr*)&addrClient,&len); /5、套接字等待連接::(服務器端) if(s_d=INVALID_SOCKET) printf("套接字等待連接(服務器端)失敗!n");char *success="成功登陸服務器!"send(s_d,success,strlen(success)+1,0); /向客戶端發送驗證信息char messM; nResult=recv(s_d,mess,strlen(mess),0); if(nResult = -1 ) /
22、判斷服務端是否關閉printf("n客戶端已斷開n");system("pause");exit(0);printf("n%s",mess);/ 功能菜單及操作 /again:system("color 0a");system("cls");puts("n");puts(" *");puts(" * * ");puts(" * 歡·迎·使·用·局·域·網·文
23、·件·發·送·工·具 *");puts(" *(服 務 端) * ");puts(" * * ");puts(" * * ");puts(" * 1.向 客 戶 端 傳 送 文 件 * ");puts(" * * ");puts(" * 2.向 客 戶 端 發 起 聊 天 * ");puts(" * * ");puts(" * 3.結 束 服 務 端 * ");puts(&qu
24、ot; * * ");puts(" * * ");puts(" * 藍天雄鷹 制作 * ");puts(" * 2012-6-20 * ");puts(" * 藍鷹展翅氣吞天下 * ");puts(" *n");puts("全屏(退出全屏)操作請按:ALT+ENTERn");printf("請輸入你要選擇的模塊的代號(1-3):");char ch;char Num10;gets(Num);ch=Num0;while(ch >='4
25、' | ch <='0')/檢測用戶選擇的代碼是否符合要求printf("n你的輸入有誤!請重新輸入:");gets(Num);ch=Num0; if('1'=ch) /發送文件模塊的處理char ch;char *str="服務端向你傳送文件,是否接受(Y/N):"send(s_d,str,strlen(str)+1,0);printf("等待客戶端回應n");nResult=recv(s_d,&ch,sizeof(char),0);if(nResult = -1 ) /判斷客戶
26、端是否關閉printf("n客戶端已斷開n");system("pause");goto again;if( ch='Y' | ch='y')sendFile(s_d);goto again;if(ch='N'| ch='n')printf("對方拒絕接受!n");system("pause");goto again;if('2'=ch)/處理聊天模塊char ch;int flag=0;char *str="服務端向你發起聊
27、天,是否接受(Y/N):"send(s_d,str,strlen(str)+1,0);printf("等待客戶端回應n");nResult=recv(s_d,&ch,sizeof(char),0); /判斷客戶端同意或不同意if(nResult = -1 ) /判斷客戶端是否關閉printf("n客戶端已斷開n");system("pause");goto again;if( ch='Y' | ch='y' )chatting_server(s_d);goto again;if(ch=
28、'N'| ch='n')printf("對方拒絕接受!n");system("pause");goto again;if('3'=ch)exit(0); /結束程序nResult=closesocket(s); /關閉套接字。if(nResult=SOCKET_ERROR) printf("8.關閉套接字(服務器端)失敗!n"); void chatting_client(SOCKET sc)system("cls");system("color 0a&qu
29、ot;);int receiveLength; char SMess1000;/發送消息的緩存char RMess1000;/接收消息的緩存char SName200;/服務端用戶的姓名char CName200;/客戶端用戶的姓名int nResult;nResult=recv(sc,RMess,strlen(RMess),0); /確認文件傳送模塊連接成功if( nResult= -1 ) /判斷服務端是否關閉printf("n服務端已斷開n");system("pause");return ;printf("%sn",RMess
30、);printf("請輸入你的名字:"); /客戶端用戶的姓名gets(CName);while(strlen(CName)=0)printf("用戶名不能為空! 請輸入你的名字:n");gets(CName);send(sc,CName,strlen(CName)+1,0); /向服務端發送姓名receiveLength=recv(sc,SName,200,0); /接收服務端用戶的姓名if(receiveLength=-1) /判斷服務端是否關閉printf("n服務端已斷開n");system("pause"
31、);return ;printf("你已和%s取的連接n",SName);printf("開始聊天(輸入exit退出聊天程序)n");while(1)struct tm *local; time_t t;/調用時間函數,顯示用戶的操作時間t=time(NULL); local=localtime(&t); nResult=recv(sc,RMess,M,0); /接收服務端發送過來的消息if(nResult = -1) /判斷服務端是否關閉printf("n服務端已斷開n");system("pause")
32、;return ;if(strcmp(RMess,"exit")=0)printf("服務端已退出聊天程序,本程序也即將退出!n");system("pause");break;printf("%st%d:%d:%d n %sn",SName,local->tm_hour,local->tm_min,local->tm_sec,RMess);printf("n請輸入信息:"); /客戶端用戶輸入消息gets(SMess);if(strcmp(SMess,"exit&q
33、uot;)=0)send(sc,SMess,strlen(SMess)+1,0);printf("你已退出聊天程序!n");system("pause");break;/服務端顯示自己的消息t=time(NULL); local=localtime(&t); printf("r%st%d:%d:%d n %sn",CName,local->tm_hour,local->tm_min,local->tm_sec,SMess);send(sc,SMess,strlen(SMess)+1,0);void sendF
34、ile(SOCKET ss)char *str1=".確認成功."send(ss,str1,strlen(str1)+1,0);/向客戶端發送驗證信息FILE *fp;long i;/文件分的的塊數char fileAddr300;char fileName100;dmm:printf("請輸入要傳送的文件絕對地址(含文件名):");gets(fileAddr);if( (fp=fopen(fileAddr,"rb") = NULL) /打開文件printf("文件地址輸入錯誤!n");goto dmm;getW_
35、name(fileAddr,fileName);send(ss,fileName,strlen(fileName)+1,0); /發送文件名fseek(fp,0L,2);long fileLength=ftell(fp);/取得文件的長度fseek(fp,0L,0);char Length100;LongToChar(fileLength,Length);send(ss,Length,strlen(Length)+1,0);/發送文件大小到客戶端if( 0 = fileLength%M )/對文件進行分塊i=fileLength/M;elsei=fileLength/M+1;char mess
36、M;long readLength;/從文件讀取的長度long sendLength;/發送文件的長度int k=1;/正在傳送的模塊號char *temp="開始接收文件"/向客戶端開始傳送,確認同步開始int nResult;nResult=recv(ss,mess,M,0);if(nResult = -1 ) /判斷客戶端是否關閉printf("n客戶端已斷開n");system("pause");return ;send(ss,temp,strlen(temp)+1,0);printf("%s,共 %ld 模塊:n&
37、quot;,mess,i);long total=0;while( k <= i )Sleep(DWORD)800);/此非常重要,降低了傳輸時間,保證了兩邊的同步readLength=fread(mess,sizeof(char),M,fp);sendLength=send(ss,mess,readLength,0);total+=sendLength;printf("r第 %d 模塊 讀取:%ldB 發送:%ldB",k,readLength,sendLength);printf(" 進度: %2.2f%c 模塊:%ld / %ld",100*
38、(total*1.0/fileLength),37,k,i);if(sendLength=SOCKET_ERROR) printf("失敗!");k+;fclose(fp);printf("n文件發送完成!n");system("pause");void chatting_server(SOCKET s_d)system("color 0a");char *str1="你同意了"send(s_d,str1,strlen(str1)+1,0);int receiveLength;/接收消息的長度c
39、har SMess1000;/發送消息的緩存char RMess1000;/接收消息的緩存char SName200;/服務端用戶的姓名char CName200;/客戶端用戶的姓名receiveLength=recv(s_d,CName,200,0);if(receiveLength=-1) /判斷客戶端是否關閉printf("客戶端已斷開n");system("pause");return ; printf("你已和%s取的連接n",CName);printf("請輸入你的名字:");gets(SName);w
40、hile(strlen(SName)=0)/循環檢測用戶名是否合法printf("用戶名不能為空! 請輸入你的名字:n");getchar();gets(SName);send(s_d,SName,strlen(SName)+1,0);/向客戶端發送姓名printf("n開始聊天(輸入exit退出聊天程序)n");while(1)struct tm *local; time_t t; t=time(NULL); local=localtime(&t); printf("nn請輸入信息:");gets(SMess);if(str
41、cmp(SMess,"exit")=0) /用戶輸入exit退出程序send(s_d,SMess,strlen(SMess)+1,0);printf("你已退出聊天程序!n");system("pause");break;/在服務端顯示自己的消息printf("r%st%d:%d:%dn %sn",SName,local->tm_hour,local->tm_min,local->tm_sec,SMess);send(s_d,SMess,strlen(SMess)+1,0);/在服務端顯示客戶端消
42、息t=time(NULL); local=localtime(&t); receiveLength=recv(s_d,RMess,M,0);if(receiveLength=-1) /判斷客戶端是否關閉printf("客戶端已斷開n");system("pause");return ;if(strcmp(RMess,"exit")=0)printf("n客戶端已退出聊天程序,本程序也即將退出!n");system("pause");break;printf("n%st%d:%d
43、:%dn %sn",CName,local->tm_hour,local->tm_min,local->tm_sec,RMess);void getW_name(char waddr,char wname)int i,k=0,j,w_len=strlen(waddr);for(i=w_len-1;i>=0;i-)if(waddri='')break;wnamek+=waddri;wnamek+='0'i=strlen(wname);for(j=0,k=i-1;j<i/2;j+,k-)char temp=wnamej;wna
44、mej=wnamek;wnamek=temp;int receiveFile(SOCKET sc)system("color 0a");int nResult;char messM;nResult=recv(sc,mess,strlen(mess),0); /確認文件傳送模塊連接成功if(nResult = -1 ) /判斷服務端是否關閉printf("n服務端已斷開n");system("pause");return 0;printf("%sn",mess);char fileName50;nResult=rec
45、v(sc,fileName,50,0); /接收文件名if(nResult = -1 ) /判斷服務端是否關閉printf("n服務端已斷開n");system("pause");return 0;nResult=recv(sc,mess,M,0); /接受文件的大小if(nResult = -1 ) /判斷服務端是否關閉printf("n服務端已斷開n");system("pause");return 0;long fileLength=StrToLong(mess); /取的待傳送文件的長度long i; /存
46、放文件塊數if( 0 = fileLength%M ) /對文件按N單位進行分塊i=fileLength/M;elsei=fileLength/M+1;FILE *fp;/打開文件int k=1; /當前正在接收文件的塊數long receiveLength;/接收文件的長度long writeLength;/已寫到文件的字符長度fp=fopen(fileName,"wb");char *temp="開始傳送文件"send(sc,temp,strlen(temp)+1,0);/向客戶端開始傳送,確認同步開始nResult=recv(sc,mess,M,0
47、);/接收服務端的確認消息if(nResult = -1 ) /判斷服務端是否關閉printf("n服務端已斷開n");system("pause");return 0;printf("%s,共 %ld 模塊:n",mess,i);long total=0;/已接收文件的長度while(k<=i) /循環的接收文件receiveLength=recv(sc,mess,M,0);if( receiveLength= -1 ) /判斷服務端是否關閉printf("n服務端已斷開n");system("p
48、ause");return 0;writeLength=fwrite(mess,sizeof(char),receiveLength,fp);printf("r第 %d 模塊 接收:%ldB 寫入:%ldB",k,receiveLength,writeLength);total+=writeLength;printf(" 進度: %2.2f%c 模塊:%ld / %ld",100*(total*1.0/fileLength),37,k,i);k+;fclose(fp);printf("n文件接收完成!n");system(&
49、quot;pause");return 0;void LongToChar(long x,char a)int count=0;if(x=0)return;while(x)acount+=x%10+'0'x=x/10;acount='0'for(int i=0,j=count-1;i<count/2;i+,j-) char temp; temp=ai; ai=aj; aj=temp;long StrToLong(char str)long result;bool bEnd;bEnd = true;result = 0;for ( int i =
50、0; bEnd; i+ )if (stri != '0' && stri >= '0' && stri <= '9')result = result * 10 + stri - '0'if (stri = '0')bEnd = false;return result;6心得體會通過本次實驗,我對網絡命令有了一定的概念性認識,并熟悉了基本網絡命令的使用,通過計算機網課程設計的實踐,了解了SOCKET編程相關的一些知識以及用法,了解了客戶端和服務器端進行通信的相關算法機制,在
51、建立通信的基礎上,實現了一些簡單的功能,更加熟悉了C語言的編程。限于自己的能力,對SOCKET編程理解還不夠透徹,還有待進一步的學習和實踐以達到對網絡的通信機制更深層次的理解。 參考文獻1陸魁軍等編著.計算機網絡基礎實踐教程.北京:清華大學出版社,2005.112譚浩強編著.C+程序設計.北京:清華大學出版社,2004,63譚浩強編著.C程序設計.北京:清華大學出版社,2005,74王洪濤編著.深入剖析Visual C+.北京:人民郵電出版社,2003,35陳良倫編著.網絡工程概論.北京:機械工業出版社,2007,4原文已完。下文為附加文檔,如不需要,下載后可以編輯刪除,謝謝!施工組織設計本施工組織設計
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全月知識試題及答案
- 工業互聯網平臺計算機視覺技術在航空航天液壓系統制造缺陷檢測的應用前景報告001
- 安全生產考核試題及答案
- 安全焊接試題及答案
- 農村金融服務創新與農村金融市場競爭策略研究報告001
- 激光祛斑培訓課件
- 培訓課件通知模板圖片
- 中國區域地理復習課課件
- 中國功夫歌唱課件大全
- 左心衰竭臨床護理
- 2024-2030年中國小型渦噴發動機行業競爭格局展望及投資策略分析報告
- UL2251標準中文版-2017電動汽車的插頭插座和耦合器UL中文版標準
- 網絡安全策略優化方案
- 工程建筑勞務合作協議范本
- 房屋優先購買權申請書
- 串標舉報信范文
- 留學銷售話術培訓
- 35kV電力線路遷改專項施工方案
- 110kV變電站施工組織總設計
- DB32T-中小學生健康管理技術規范 第1部分:心理健康編制說明
- 輸水管線工程施工方案
評論
0/150
提交評論