ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:535.17KB ,
资源ID:4293132      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4293132.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(在Linux下基于TCP协议的文件传输程序汇总.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

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

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

4、,文件传输文件完成(6)看到服务器端也显示文件传输完成服务器源码:#include #include #include #include #include #include #include #include #define PORT 6000#define LISTENQ 20#define BUFFSIZE 4096#define FILE_NAME_MAX_SIZE 512int main(int argc, char *argv) /输入文件名称 char filenameFILE_NAME_MAX_SIZE; bzero(filename,FILE_NAME_MAX_SIZE); p

5、rintf(Please input the file name 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

6、(PORT); /创建用于internet的流协议(TCP)socket 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_

7、t length=sizeof(clientaddr); /等待请求 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)

8、perror(Send); exit(1); bzero(buff,BUFFSIZE); 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_SIZ

9、E 512 int main(int argc, char *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

10、_port=htons(0); /0表示让系统自动分配一个空闲端口 /创建用于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地址结

11、构体 struct sockaddr_in svraddr; 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

12、(clientfd,(struct sockaddr*)&svraddr,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(bu

13、ff); printf(Preparing recv file : %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;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1