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

上传人:小飞机 文档编号:3379404 上传时间:2023-03-12 格式:DOCX 页数:6 大小:38.72KB
返回 下载 相关 举报
在Linux下基于TCP协议的文件传输程序.docx_第1页
第1页 / 共6页
在Linux下基于TCP协议的文件传输程序.docx_第2页
第2页 / 共6页
在Linux下基于TCP协议的文件传输程序.docx_第3页
第3页 / 共6页
在Linux下基于TCP协议的文件传输程序.docx_第4页
第4页 / 共6页
在Linux下基于TCP协议的文件传输程序.docx_第5页
第5页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《在Linux下基于TCP协议的文件传输程序.docx》由会员分享,可在线阅读,更多相关《在Linux下基于TCP协议的文件传输程序.docx(6页珍藏版)》请在三一办公上搜索。

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

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

3、。连接成功后,首先,接收服务器发送的文件信息。接收成功后,开始数据的接收。文件接收完毕,显示文件已接收完成。 图2 客户端流程图 了验证设计的正确性,在Ubuntu 12.04系统上对可执行文件进行了回环测试。 步骤如下: 测试文件a.txt及服务器端文件源fileserver.c和可执行文件fileserver (2)客户端源文件及可执行文件 执行服务器端文件fileserver并输入要传输的文件a.txt,等待客户端连接 执行客户端文件fileclient,如果不输入IP地址将显示提示 执行客户端文件后,输入完整命令,文件传输文件完成 看到服务器端也显示文件传输完成 服务器源码: #inc

4、lude #include #include #include #include #include #include #include #define PORT 6000 #define LISTENQ 20 #define BUFFSIZE 4096 #define FILE_NAME_MAX_SIZE 512 int main(int argc, char *argv) /输入文件名称 char filenameFILE_NAME_MAX_SIZE; bzero(filename,FILE_NAME_MAX_SIZE); printf(Please input the file name

5、you wana to send:); scanf(%s,&filename); getchar; /设置一个socket地址结构 int sockfd,connfd; struct sockaddr_in svraddr,clientaddr; bzero(&svraddr,sizeof(svraddr);/把一段内存区的内容全部设置为0 svraddr.sin_family=AF_INET; svraddr.sin_addr.s_addr=htonl(INADDR_ANY); svraddr.sin_port=htons(PORT); /创建用于internet的流协议(TCP)socke

6、t sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd0) perror(socket); exit(1); /把socket和socket地址结构绑定 if(bind(sockfd,(struct sockaddr*)&svraddr,sizeof(svraddr)0) perror(bind); exit(1); /监听 if(listen(sockfd,LISTENQ)0) perror(listen); exit(1); while(1)/服务器端一直运行 socklen_t length=sizeof(clientaddr); /等待请求

7、connfd=accept(sockfd,(struct sockaddr*)&clientaddr,&length); if(connfdFILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(filename); count=send(connfd,buff,BUFFSIZE,0); if(count0) printf(file_block_length:%dn,file_block_length); if(send(connfd,buff,file_block_length,0)0) perror(Send); exit(1); bzero(buff,B

8、UFFSIZE); fclose(fd); printf(Transfer file finished !n); close(connfd); close(sockfd);/关闭socket return 0; 客户端源码: #include #include #include #include #include #include #include #include #define PORT 6000 #define LISTENQ 20 #define BUFFSIZE 4096 #define FILE_NAME_MAX_SIZE 512 int main(int argc, char *

9、argv) int clientfd; if(argc!=2)/判断参数是否完整 fprintf(stderr,Usage:./fileclient n); exit(1); struct sockaddr_in clientaddr; 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表示让系统自动分配一个空闲

10、端口 /创建用于internet的流协议(TCP)socket,用clientfd代表客户机socket clientfd=socket(AF_INET,SOCK_STREAM,0); if(clientfd0) perror(socket); exit(1); /把客户机的socket和客户机的socket地址结构联系起来 if(bind(clientfd,(struct sockaddr*)&clientaddr,sizeof(clientaddr)0) perror(bind); exit(1); /设置一个socket地址结构体 struct sockaddr_in svraddr;

11、bzero(&svraddr,sizeof(svraddr); if(inet_aton(argv1,&svraddr.sin_addr)=0)/IP地址来自程序的参数 perror(inet_aton); exit(1); svraddr.sin_family=AF_INET; svraddr.sin_port=htons(PORT); socklen_t svraddrlen=sizeof(svraddr); /向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接 if(connect(clientfd,(struct sockaddr*)&sv

12、raddr,svraddrlen)0) perror(connect); exit(1); /接收文件信息 char buffBUFFSIZE; char filenameFILE_NAME_MAX_SIZE; bzero(filename, FILE_NAME_MAX_SIZE); int count; bzero(buff,BUFFSIZE); count=recv(clientfd,buff,BUFFSIZE,0); if(countFILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buff); printf(Preparing recv file

13、 : %s-from-%s n,filename,argv1); /接收文件 FILE *fd=fopen(filename,wb+); if(NULL=fd) perror(open); exit(1); bzero(buff,BUFFSIZE); int length=0; while(length=recv(clientfd,buff,BUFFSIZE,0) if(length0) perror(recv); exit(1); int writelen=fwrite(buff,sizeof(char),length,fd); if(writelenlength) perror(write); exit(1); bzero(buff,BUFFSIZE); printf(Receieved file:%s from %s finished!n,filename,argv1); fclose(fd); close(clientfd); /关闭socket return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号