1、实验课程名称: 高性能计算机网络 实验项目名称基于TCP的网络文件传输实验成绩实验者XX专业班级计算机06311班组别同组者实验日期2015年1月10日第一部分:实验分析与设计一、 实验内容描述(问题域描述)内容:综合运用网络协议、编程语言、API和图形界面实现基于TCP协议建立、监听、连接、发送数据和接收数据的网络通信程序。目的:熟悉TCP/IP协议的功能和网络操作,初步了解windows环境下使用网络编程实现点对点文本传输。二、 实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)本程序是基于TCP/IP协议栈的网络编程,使用C语言,利用操作系统提供的
2、套接字网络编程接口进行编写TCP协议是其中重要的传输协议,为应用层提供可靠的端到端的流传输服务.其中套接字取值sock_stream即为TCP的流传输服务Windowssocket包含了人们所熟悉的BerkeleySocket风格的函数库,也包含了一组针对windows的扩展库函数,以使程序员能充分的利用windows驱动消息机制进行编程。WindowsSockets的规范本意在于提供给应用开发者一套简单的API,并让个网络应用软件开发商遵守该协议。此外在一个特定的版本windows基础上,Windowssocket也定义了一个二进制借口(ABI),从此来保证WindowssocketAPI应
3、用程序能够在任何符合Windowssocket协议的实现上工作。三、主要仪器设备及耗材Windows 7,Eclipse,JDK 1.7。这里用两个主机,一个做服务器端,一个做客户端。第二部分:实验调试与结果分析(可加页)一、 调试过程(包括调试方法描述、实验数据记录,实验现象记录,实验过程发现的问题等)服务器端代码:#include#include#pragmacomment(lib,ws2_32.lib)#defineSIZE1024*8voidmain() /创建套接字WORDmyVersionRequest;WSADATAwsaData;myVersionRequest=MAKEWOR
4、D(1,1);interr;err=WSAStartup(myVersionRequest,&wsaData);if(!err)printf(已打开套接字n);else/进一步绑定套接字printf(嵌套字未打开!);return;SOCKETserSocket=socket(AF_INET,SOCK_STREAM,0);/创建了可识别套接字/需要绑定的参数SOCKADDR_INaddr;addr.sin_family=AF_INET;addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/ip地址addr.sin_port=htons(6000);/绑定端口
5、bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR);/绑定完成listen(serSocket,5);/其中第二个参数代表能够接收的最多的连接数/开始进行监听SOCKADDR_INclientsocket;intlen=sizeof(SOCKADDR);SOCKETserConn;charsendBuf50;/如果这里不是accept而是conection的话,就会不断的监听。serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);sprintf(sendBuf,welcome%stobeji
6、ng,inet_ntoa(clientsocket.sin_addr);/找对对应的IP并且将这行字打印到那里/发送欢迎信息send(serConn,sendBuf,strlen(sendBuf)+1,0);FILE*fp;lable1:printf(客户端已打开n请输入存放文件地址:n);charpath100=0;inti=0;while(pathi!=0)if(pathi=/)pathi=;i+;gets(path);if(fp=fopen(path,wb)=NULL)printf(文件未打开n);gotolable1;elseprintf(文件已打开开始文件传输.n);/发送开始标志s
7、end(serConn,开始传送,strlen(开始传送)+1,0);/得到文件大小chardatalength20;longintlength=0;recv(serConn,datalength,21,0);length=atol(datalength);printf(得到文件大小:%dn,length);/开始传送doublecent=0.0;charreceiveBufSIZE;longintx=0;while(1)x=x+SIZE;if(xlength)cent=(double)x*100.0/(double)length;printf(已接收:%4.2fn,cent);recv(se
8、rConn,receiveBuf,SIZE+1,0);fwrite(receiveBuf,1,SIZE,fp);elserecv(serConn,receiveBuf,length+SIZE-x+1,0);printf(文件接收完毕n);fwrite(receiveBuf,1,length+SIZE-x,fp);fclose(fp);break; closesocket(serConn);/关闭WSACleanup();/释放资源的操作system(pause);客户端代码:#include#include#pragmacomment(lib,ws2_32.lib)#defineSIZE102
9、4*8voidmain()FILE*fp;interr;intlength=0;SOCKETclientSocket;SOCKADDR_INclientsock_in;charreceiveBuf100=0;charip_addr16=127.0.0.1;WORDversionRequired;WSADATAwsaData;versionRequired=MAKEWORD(1,1);err=WSAStartup(versionRequired,&wsaData);/协议库的版本信息if(!err)printf(客户端嵌套字已经打开!n);elseprintf(客户端的嵌套字打开失败!n);re
10、turn;/结束clientSocket=socket(AF_INET,SOCK_STREAM,0);printf(请输入主机IP:n);scanf(%s,ip_addr);/连接服务器clientsock_in.sin_addr.S_un.S_addr=inet_addr(ip_addr);clientsock_in.sin_family=AF_INET;clientsock_in.sin_port=htons(6000);connect(clientSocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR);/开始连接recv(clientSocke
11、t,receiveBuf,101,0);printf(%sn,receiveBuf);charpath100=0;gets(path);inti=0;doprintf(请输入文件地址:n);gets(path);while(pathi!=0)if(pathi=/)pathi=;i+;i=0;if(fp=fopen(path,rb)=NULL)i=1;printf(文件未打开n);while(i);fseek(fp,0L,SEEK_END);length=ftell(fp);printf(待传送文件大小:%dn,length);printf(文件已经打开等待主机消息.n);/得到主机开始传送消息
12、recv(clientSocket,receiveBuf,101,0);printf(%sn,receiveBuf);if(strcmp(receiveBuf,开始传送)=0)/传送文件长度charsendBuf20;ltoa(length,sendBuf,10);send(clientSocket,sendBuf,21,0);fseek(fp,0L,SEEK_SET);/传送文件longinty=0;doublecent;chartransSIZE;while(!feof(fp)fread(trans,1,SIZE,fp);y=y+SIZE;if(ylength)cent=(double)y
13、*100.0/(double)length;printf(已发送:%4.2fn,cent);send(clientSocket,trans,SIZE+1,0);elsesend(clientSocket,trans,length+SIZE-y+1,0);closesocket(clientSocket);WSACleanup();fclose(fp);printf(文件发送完毕n);system(pause);二、 实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等) 客户端运行结果服务器端运行结果三、 实验小结、建议及体会通过此次实验过程我充分了解了TCP/IP协议的相关知识以及其中两个重要协议TCPUDP的特点与差异,进一步学习了文件传输等知识,创建套接字监听传输关闭等过程,直到最后写出C/S模式的文件传输程序感觉我们巩固了教材的内容实践的能力也得到了提高不足之处就是自己粗心大意,在写代码时候参数注解等经常注明的不够好,希望以后能养成良好的编程习惯。