版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版房屋代持业务合同范本3篇
- 二零二五版电机维修智能化改造合同范本3篇
- 二零二五年度房地产经纪服务合同7篇
- 二零二五版购房借款及房地产开发商风险控制担保服务合同3篇
- 二零二五版商业地产买卖合同模板下载3篇
- 二零二五年度高等教育机构外国专家项目合作合同参考书3篇
- 二零二五版家用空调安装与室内环境改善合同3篇
- 二零二五年度成都上灶师父招聘与餐饮业人才服务合同2篇
- 展会创意展示合同(2篇)
- 2025年度油气田2#配电房土建安装与防爆电气设备合同3篇
- 下肢皮牵引护理PPT课件(19页PPT)
- 台资企业A股上市相关资料
- 电 梯 工 程 预 算 书
- 参会嘉宾签到表
- 机械车间员工绩效考核表
- 形式发票格式2 INVOICE
- 2.48低危胸痛患者后继治疗评估流程图
- 人力资源管理之绩效考核 一、什么是绩效 所谓绩效简单的讲就是对
- 山东省医院目录
- 云南地方本科高校部分基础研究
- 废品管理流程图
评论
0/150
提交评论