在Linux下基于TCP协议的文件传输程序_第1页
在Linux下基于TCP协议的文件传输程序_第2页
在Linux下基于TCP协议的文件传输程序_第3页
在Linux下基于TCP协议的文件传输程序_第4页
在Linux下基于TCP协议的文件传输程序_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux下基于TCP/IP协议的文件传输程序【设计目的】通过LinuxC编程,设计一个基于TCP/IP的文件传输系统,实现网络文件的收发【设计环境】Ubuntu12.04【设计方案】(1)文件读写任意文件都可以二进制的方式进行读写,为了实现任意文件类型的传输,在读写文件的过程中,必须采用二进制的读写方式。(2)传输协议为了保证数据的正确性,文件传输需要采用一种可靠的传输协议。UDP协议实现比较简单,但UDP面向无连接,传输过程中,会出现丢包的情况,导致数据发送失败。故采用面向连接的TCP/IP协议,防止传输过程中的数据丢失的情况。(3)大文件的传输对于比较大的文件,应该进行分包操作,以防止占

2、用过多的内存,导致文件发送失败。【设计流程】如图1所示,服务器程序作为文件的发送方。首先,服务器端输入要发送的文件。然后,创建一个流式套接字(SOCK_STREAM),进行绑定。绑定成功后,执行监听,当有客户发送连接请求,执行Accept(),接收来自客户端的请求。连接建立后,首先服务器向客服端发送的文件的文件名及扩展名等信息。信息发送完毕,服务器方将待发送的数据读入缓冲区,通过套接字将数据发送出去。发送完成后退出,并显示发送完成的信息。图1服务器流程图如图2所示,客户端程序完成文件的接收操作。首先,创建一个流式套接字。套接字创建成功后,对该套接字进行绑定。绑定成功后,向服务器方发送连接请求。

3、连接成功后,首先,文件接收完毕,显示文件已接接收服务器发送的文件信息。接收成功后,开始数据的接收。收完成。创运SOCKIImySOCKUI还收义伴均器图2客户端流程图【设计测试】了验证设计的正确性,在Ubuntu12.04系统上对可执行文件进行了回环测试。步骤如下:(1)测试文件a.txt及服务器端文件源方leserver.c和可执行文件巾leserverrootompaq:/optfileserverfileserverxa.txtiftft_mogb文件系八_4QGB文件系一一工作空间计II如主文胃*靠面口视省I0图片bn文档g下载音乐文件否S回收由网绪fileclientfiLeclie

4、ntc计算机|主文件S3桌面决频国图片心文档目下我上音乐_文件系国回收同网绪q:i.T网rootcompaqcd/opt/口。上勺匚QFipdq:/口pt#gcc-oftieserverfileserver,cfileserver»c:在西数*中:fileserver*c:0:6;警告;格式'*Uexpectsargumentoftyperchar*'Fbutargument2hastype*char(*)S12*-WforFiatrootCanpaq:/opt#1(2)客户端源文件及可执行文件irootCompaq:用p“"bt口口tE°Epaq

5、t#cd/opt/abc/rootConpaq:/opt/abc#gcc-oftlecltentfileclient,crtlecltent.c:在函数'nain'中;ftlecltent.c:79:6:警告;格式'*£'expectsargunentoftypecharbutargument3hastyperchar*'-HformattiXeclient»c:106:6i警告;格式'嘱s'expectsargumentoftype*charbutargumentMhastypefchar*J-Wfornatroot

6、Compaq:/opt/abc#|(3)执行服务器端文件fileserver并输入要传车的文件a.txt,等待客户端连接opt设务口就砥文件系-40文件系工作空间fileserver计机4主文N三桌面H现期延图片史文档下flj上音缶工文件系之回收站网塔a.txtl-ElIfileserver,c国浏竟网Ci'rootCompaq:/optrootConpaq:cd/apt/rootConpaq:/opt#icserver.cr在国数'雁工n'中:flleserver.czod:番告二格式ent2hastypefch

7、arrootConpaq:/optff./ftieserverPleaseinputthefilenameyouexpectsargumentoftypercharbutargun'Wfornatwan,atosend:a.txt(4)执行客户端文件fileclient,如果不输入IP地址将显示提示(5)执行客户端文件后,输入完整命令,文件传输文件完成一30GB文件系.一40GB文件系口工作空间计算机a.txtfileclient小tlfileclientxrcotCompaq:/opt/abc主文件J里面视翔迪国片噌文档口下装上音乐一文件系£8回收站网络工作空间a,txtf

8、ileserverfileserverxrciotConipdq;cd/opt/abc/rootCcmpaq:/opt/abcflgcc*ofileclientftleclient*cfilecltent*c:在国数,natn中;fiteclierit.c:79:6:警告:格式"%s'expectsargunentoftype*char*11butarguent3hastype*char*'-wformatfilecltent.c:166:6:警告;格式'%s'expectsargumentoftyperchar*"butargmerit3h

9、astypefchar*r-wfornatrootConpaq:/opt/abe#./fileclientUsage:./filecLtent<IP_Address>rootCompaq:/opt/abc#./ftlecltent127,e»0.1Preparingreevfile:a.txtfromReceievedftleta+txtfrom127*0-G*lfinished!IrootConpaq:/opt/abc#|向浏贤网f(6)看到服务器端也显示文件传输完成设咨计真机La主哀件目»泉面且视颉值图片奥文档0下载,岳百乐|一文件系匕回收

10、站两堵皿浏威网XQ一马。“蹲coEpmq:/optootqcompaqt尊cd/opt/rootConpaq:/opt#gee-oftleserverftleserver,gftleserwer.e:在函数,mMn'中1ftleserver+c:20:6:警告;格式Vexpectsargumentoftypefchar*'pbutargjrent2hastypecharS12J1-WfornatJrootgConpaq:/opt#,/ftieserverPleasetnputthefilenameyouwanatosend:a.txtfIle_block_length:10Tr

11、ansferfilefinished!服务器源码:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/types.h>#include<sys/stat.h>#include<sys/socket.h>#include<netinet/in.h>#definePORT6000#defineLISTENQ20#defineBUFFSIZE4096#defineFILE_NAME_MAX_

12、SIZE512intmain(intargc,char*argv)/输入文件名称charfilenameFILE_NAME_MAX_SIZE;bzero(filename,FILE_NAME_MAX_SIZE);printf("Pleaseinputthefilenameyouwanatosend:");scanf("%s",&filename);getchar();/设置一个socket地址结构intsockfd,connfd;structsockaddr_insvraddr,clientaddr;bzero(&svraddr,size

13、of(svraddr);/把一段内存区的内容全部设置为0svraddr.sin_family=AF_INET;svraddr.sin_addr.s_addr=htonl(INADDR_ANY);svraddr.sin_port=htons(PORT);创建用于internet的流协议(TCP)socketsockfd=socket(AF_INET,SOCK_STREAM,0);if(sockfd<0)perror("socket");exit(1);把socket和socket地址结构绑定if(bind(sockfd,(structsockaddr*)&svr

14、addr,sizeof(svraddr)<0)perror("bind");exit(1);)/监听if(listen(sockfd,LISTENQ)<0)(perror("listen");exit(1);)while(1)/服务器端一直运行(socklen_tlength=sizeof(clientaddr);等待请求connfd=accept(sockfd,(structsockaddr*)&clientaddr,&length);if(connfd<0)(perror("connect");e

15、xit(1);)发送文件信息charbuffBUFFSIZE;intcount;bzero(buff,BUFFSIZE);strncpy(buff,filename,strlen(filename)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(filename);count=send(connfd,buff,BUFFSIZE,0);if(count<0)(perror("Sendfileimformation");exit(1);)/读取文件并发送文件FILE*fd=fopen(filename,"rb&q

16、uot;);if(fd=NULL)(printf("File:%snotfound!n",filename);)else(bzero(buff,BUFFSIZE);intfile_block_length=0;while(file_block_length=fread(buff,sizeof(char),BUFFSIZE,fd)>0)printf("file_block_length:%dn",file_block_length);if(send(connfd,buff,file_block_length,0)<0)perror("

17、Send");exit(1);bzero(buff,BUFFSIZE);fclose(fd);printf("Transferfilefinished!n");close(connfd);close(sockfd);关闭socketreturn0;客户端源码:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<sys/types.h>#include<sys/stat.h>#includ

18、e<sys/socket.h>#include<netinet/in.h>#definePORT6000#defineLISTENQ20#defineBUFFSIZE4096#defineFILENAMEMAXSIZE512intmain(intargc,char*argv)intclientfd;if(argc!=2)/判断参数是否完整fprintf(stderr,"Usage:./fileclient<IP_Address>n");exit(1);structsockaddr_inclientaddr;bzero(&clien

19、taddr,sizeof(clientaddr);clientaddr.sin_family=AF_INET;clientaddr.sin_addr.s_addr=htons(INADDR_ANY);/INADDR_ANY表示自动获取本机地址clientaddr.sin_port=htons(0);/0表示让系统自动分配一个空闲端口/创建用于internet的流协议(TCP)socket,用clientfd代表客户机socketclientfd=socket(AF_INET,SOCK_STREAM,0);if(clientfd<0)perror("socket");e

20、xit(1);把客户机的socket和客户机的socket地址结构联系起来if(bind(clientfd,(structsockaddr*)&clientaddr,sizeof(clientaddr)<0)perror("bind");exit(1);设置一个socket地址结构体structsockaddr_insvraddr;bzero(&svraddr,sizeof(svraddr);if(inet_aton(argv1,&svraddr.sin_addr)=0)/IP地址来自程序的参数perror("inet_aton&qu

21、ot;);exit(1);svraddr.sin_family=AF_INET;svraddr.sin_port=htons(PORT);socklen_tsvraddrlen=sizeof(svraddr);向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接if(connect(clientfd,(structsockaddr*)&svraddr,svraddrlen)<0)perror("connect");exit(1);接收文件信息charbuffBUFFSIZE;charfilenameFILE_NAME_MAX_SIZE;bzero(filename,FILE_NAME_MAX_SIZE);intcount;b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论