在Linux下基于TCP协议的文件传输程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Linux下基于TCP/IP协议的文件传输程序【设计目的】通过LinuxC编程,设计一个基于TCP/IP的文件传输系统,实现网络文件的收发【设计环境】Ubuntu12.04【设计方案】(1)文件读写任意文件都可以二进制的方式进行读写,为了实现任意文件类型的传输,在读写文件的过程中,必须采用二进制的读写方式。(2)传输协议为了保证数据的正确性,文件传输需要采用一种可靠的传输协议。UDP协议实现比较简单,但UDP面向无连接,传输过程中,会出现丢包的情况,导致数据发送失败。故采用面向连接的TCP/IP协议,防止传输过程中的数据丢失的情况。(3)大文件的传输对于比较大的文件,应该进行分包操作,以防止占用过多的内存,导致文件发送失败。【设计流程】如图1所示,服务器程序作为文件的发送方。首先,服务器端输入要发送的文件。然后,创建一个流式套接字(SOCK_STREAM),进行绑定。绑定成功后,执行监听,当有客户发送连接请求,执行Accept(),接收来自客户端的请求。连接建立后,首先服务器向客服端发送的文件的文件名及扩展名等信息。信息发送完毕,服务器方将待发送的数据读入缓冲区,通过套接字将数据发送出去。发送完成后退出,并显示发送完成的信息。图1服务器流程图如图2所示,客户端程序完成文件的接收操作。首先,创建一个流式套接字。套接字创建成功后,对该套接字进行绑定。绑定成功后,向服务器方发送连接请求。连接成功后,首先,接收服务器发送的文件信息。接收成功后,开始数据的接收。文件接收完毕,显示文件已接收完成。图2客户端流程图【设计测试】了验证设计的正确性,在Ubuntu12.04系统上对可执行文件进行了回环测试。步骤如下:(1)测试文件a.txt及服务器端文件源fileserver.c和可执行文件fileserver(2)客户端源文件及可执行文件(3)执行服务器端文件fileserver并输入要传输的文件a.txt,等待客户端连接(4)执行客户端文件fileclient,如果不输入IP地址将显示提示(5)执行客户端文件后,输入完整命令,文件传输文件完成(6)看到服务器端也显示文件传输完成服务器源码:#includestdio.h#includestdlib.h#includeunistd.h#includestring.h#includesys/types.h#includesys/stat.h#includesys/socket.h#includenetinet/in.h#definePORT6000#defineLISTENQ20#defineBUFFSIZE4096#defineFILE_NAME_MAX_SIZE512intmain(intargc,char**argv[]){//输入文件名称charfilename[FILE_NAME_MAX_SIZE];bzero(filename,FILE_NAME_MAX_SIZE);printf(Pleaseinputthefilenameyouwanatosend:);scanf(%s,&filename);getchar();//设置一个socket地址结构intsockfd,connfd;structsockaddr_insvraddr,clientaddr;bzero(&svraddr,sizeof(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(sockfd0){perror(socket);exit(1);}//把socket和socket地址结构绑定if(bind(sockfd,(structsockaddr*)&svraddr,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(connfd0){perror(connect);exit(1);}//发送文件信息charbuff[BUFFSIZE];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(count0){perror(Sendfileimformation);exit(1);}//读取文件并发送文件FILE*fd=fopen(filename,rb);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:%d\n,file_block_length);if(send(connfd,buff,file_block_length,0)0){perror(Send);exit(1);}bzero(buff,BUFFSIZE);}fclose(fd);printf(Transferfilefinished!\n);}close(connfd);}close(sockfd);//关闭socketreturn0;}客户端源码:#includestdio.h#includestdlib.h#includeunistd.h#includestring.h#includesys/types.h#includesys/stat.h#includesys/socket.h#includenetinet/in.h#definePORT6000#defineLISTENQ20#defineBUFFSIZE4096#defineFILE_NAME_MAX_SIZE512intmain(intargc,char**argv[]){intclientfd;if(argc!=2)//判断参数是否完整{fprintf(stderr,Usage:./fileclientIP_Address\n);exit(1);}structsockaddr_inclientaddr;bzero(&clientaddr,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(clientfd0){perror(socket);exit(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(argv[1],&svraddr.sin_addr)==0)//IP地址来自程序的参数{perror(inet_aton);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);}//接收文件信息charbuff[BUFFSIZE];charfilename[FILE_NAME_MAX_SIZE];bzero(filename,FILE_NAME_MAX_SIZE);intcount;bzero(buff,BUFFSIZE);count=recv(clientfd,buff,BUFFSIZE,0);if(count0){perror(recv);exit(1);}strncpy(filename,buff,strlen(buff)FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buff));printf(Preparingrecvfile:%s---from---%s\n,filename,argv[1]);//接收文件FILE*fd=fopen(filename,wb+);if(NULL==fd){perror(open);exit(1);}bzero(buff,BUFFSIZE);intlength=0;while(length=recv(clientfd,buff,BUFFSIZE,0)){if(length0){perror(recv);exit(1);}intwritelen=fwrite(buff,sizeof(char),length,fd);if(writelenlength){perror(write);exit(1);}bzero(buff,BUFFSIZE);}printf(Receievedfile:%sfrom%sfinished!\n,filename,argv[1]);fclose(fd);close(clientfd);//关闭socketreturn0;}

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功