




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络编程实验报告 课 程 名 称: 网络编程 实验项目名称: 网络编程 班 级: 实验室名称: 专 业: 网 络 工 程 任 课 教 师: 黄 梅 根 学 号: 姓 名: 基于TCP的网络文件传输实验报告一、 实验目的1、 熟悉TCP/IP协议的功能和网络操作2、 编写小型的socket应用程序,初步了解windows环境下使用sockets编程,实现点对点文本传输。二、 实验原理本程序是基于TCP/IP协议栈的网络编程,使用C语言,利用操作系统提供的套接字网络编程接口进行编写TCP协议是其中重要的传输协议,为应用层提供可靠的 端到端的流传输服务.其中套接字取值sock_stream即为TCP的流传输服务Windows socket包含了人们所熟悉的Berkeley Socket风格的函数库,也包含了一组针对windows的扩展库函数,以使程序员能充分的利用windows驱动消息机制进行编程。Windows Sockets的规范本意在于提供给应用开发者一套简单的API,并让个网络应用软件开发商遵守该协议。此外在一个特定的版本windows基础上,Windows socket也定义了一个二进制借口(ABI),从此来保证Windows socket API应用程序能够在任何符合Windows socket协议的实现上工作。三、 设计概述1、 创建套接字服务进程和客户进程在实现通信前必须创建各自的套接字,然后才能用相应的套接字进行发送接收操作,服务进程总是先于客户端进程启动,服务器端进程和客户端进程创建套接字。Socket()函数实现代码如下:SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);/创建了可识别套接字2、 地址绑定当调用socket()创建套接字后,服务器必须把套接字与自己的地址显式地建立联系,以便客户端向该IP地址和端口号的服务进程请求服务,这个过程是通过调用函数bind()实现的。bind()函数原型如下:int bind(SOCKET s ,const struct sockaddr FAR*name ,int namelen);3、 服务器套接字置为监听模式将服务器设置为监听工作方式后,使用API调用listen(): int listen(SOCKET s, int backlog);第一个参数指定套接字。第二个参数指定了正在等待连接的最大队列长度。若无错误发生,则listen()函数返回0。 4、 建立连接,进行文件传输调用gets(path)获得传输文件的路径和存放文件路径,这个过程中还需调用send()函数和recv()函数,共同协调实现文件传送。四、 源代码 服务器端#include #include #pragma comment(lib,ws2_32.lib)#define SIZE 1024*8void main()/创建套接字WORD myVersionRequest;WSADATA wsaData;myVersionRequest=MAKEWORD(1,1);int err;err=WSAStartup(myVersionRequest,&wsaData);if (!err) printf(已打开套接字n); else /进一步绑定套接字 printf(嵌套字未打开!); return;SOCKET serSocket=socket(AF_INET,SOCK_STREAM,0);/创建了可识别套接字/需要绑定的参数SOCKADDR_IN addr;addr.sin_family=AF_INET;addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/ip地址addr.sin_port=htons(6000);/绑定端口bind(serSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR);/绑定完成listen(serSocket,5);/其中第二个参数代表能够接收的最多的连接数/开始进行监听/SOCKADDR_IN clientsocket;int len=sizeof(SOCKADDR);SOCKET serConn;char sendBuf50;serConn=accept(serSocket,(SOCKADDR*)&clientsocket,&len);/如果这里不是accept而是conection的话。就会不断的监听sprintf(sendBuf,welcome %s to bejing,inet_ntoa(clientsocket.sin_addr);/找对对应的IP并且将这行字打印到那里/发送欢迎信息send(serConn,sendBuf,strlen(sendBuf)+1,0);FILE *fp;lable1: printf(客户端已打开n请输入存放文件地址:n);char path100=0;int i=0;while(pathi!=0) if(pathi=/) pathi=; i+;gets(path);if(fp=fopen(path,wb)=NULL) printf(文件未打开n); goto lable1;else printf(文件已打开 开始文件传输.n); /发送开始标志 send(serConn,开始传送,strlen(开始传送)+1,0); /得到文件大小 char datalength20; long int length=0; recv(serConn,datalength,21,0); length=atol(datalength); printf(得到文件大小: %dn,length); /开始传送 double cent=0.0; char receiveBufSIZE; long int x=0; while (1) x=x+SIZE; if(xlength) cent=(double)x*100.0/(double)length; printf(已接收: %4.2fn,cent); recv(serConn,receiveBuf,SIZE+1,0); fwrite(receiveBuf,1,SIZE,fp); else recv(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 #pragma comment(lib,ws2_32.lib)#define SIZE 1024*8void main()FILE *fp;int err;int length=0;SOCKET clientSocket;SOCKADDR_IN clientsock_in;char receiveBuf100=0;char ip_addr16=127.0.0.1;WORD versionRequired;WSADATA wsaData;versionRequired=MAKEWORD(1,1);err=WSAStartup(versionRequired,&wsaData);/协议库的版本信息if (!err) printf(客户端嵌套字已经打开!n);else printf(客户端的嵌套字打开失败!n); return;/结束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(clientSocket,receiveBuf,101,0);printf(%sn,receiveBuf); char path100=0;gets(path);int i=0;do printf(请输入文件地址: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);/得到主机开始传送消息recv(clientSocket,receiveBuf,101,0);printf(%sn,receiveBuf);if(strcmp(receiveBuf,开始传送)=0) /传送文件长度 char sendBuf20; ltoa(length,sendBuf,10); send(clientSocket,sendBuf,21,0); fseek(fp,0L,SEEK_SET); /传送文件 long int y=0; double cent; char transSIZE; while(!feof(fp) fread(trans,1,SIZE,fp); y=y+SIZE; if(ylength) cent=(double)y*100.0/(double)length; printf(已发送: %4.2fn,cent); send(clientSocket,trans,SIZE+1,0); else send(clientSocket,trans,length+SIZE-y+1,0); closesocket(clientSocket); WSACleanup(); fclose(fp);printf(文件发送完毕n);system(pause);五、 实验结果及分析:客户端运行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保险产品采购与销售合同
- 2025年综合类-内分泌专业知识-痛风历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-公司信贷-公司信贷-个人贷款历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-会计-公允价值计量历年真题摘选带答案(5卷单选100题合辑)
- 2025年综合类-人文知识竞赛-工程地质工程施工钻工考试历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-主管药师-主管药师专业实践(综合练习)历年真题摘选带答案(5卷单选100题合辑)
- 2025年综合类-临床医学检验技术(主管技师)-临床化学历年真题摘选带答案(5卷单选题百道集合)
- 2025年综合类-中西医结合内科学-第十四单元肝系病症历年真题摘选带答案(5卷单选题百道集合)
- 2025年综合类-中级房地产经济-第八章房地产估计历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-中学教育学-第六章课程历年真题摘选带答案(5卷单选100题合辑)
- 公司销售提成管理办法
- 初一物理知识点视频课件
- 2025年大连市高校毕业生“三支一扶”计划招募笔试考试试题【答案】
- 2025年杭州劳动合同样本
- 2025内蒙古森工集团招聘高校毕业生114人(第二批)笔试参考题库附带答案详解版
- 二手车抵押回购交易合同
- 2025河南行政执法资格考试模拟卷(含答案)
- 肿瘤病人护理课件
- 老年患者综合评估表
- 中国统治者列表(03)夏朝方国与周边民族
- 《中华人民共和国海关进出境自用物品申请表》样式和填表说明
评论
0/150
提交评论