在Linux下基于TCP协议的文件传输程序汇总Word文档下载推荐.docx
《在Linux下基于TCP协议的文件传输程序汇总Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《在Linux下基于TCP协议的文件传输程序汇总Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
绑定成功后,执行监听,当有客户发送连接请求,执行Accept(),接收来自客户端的请求。
连接建立后,首先服务器向客服端发送的文件的文件名及扩展名等信息。
信息发送完毕,服务器方将待发送的数据读入缓冲区,通过套接字将数据发送出去。
发送完成后退出,并显示发送完成的信息。
图1服务器流程图
如图2所示,客户端程序完成文件的接收操作。
首先,创建一个流式套接字。
套接字创建成功后,对该套接字进行绑定。
绑定成功后,向服务器方发送连接请求。
连接成功后,首先,接收服务器发送的文件信息。
接收成功后,开始数据的接收。
文件接收完毕,显示文件已接收完成。
图2客户端流程图
【设计测试】
了验证设计的正确性,在Ubuntu12.04系统上对可执行文件进行了回环测试。
步骤如下:
(1)测试文件a.txt及服务器端文件源fileserver.c和可执行文件fileserver
(2)客户端源文件及可执行文件
(3)执行服务器端文件fileserver并输入要传输的文件a.txt,等待客户端连接
(4)执行客户端文件fileclient,如果不输入IP地址将显示提示
(5)执行客户端文件后,输入完整命令,文件传输文件完成
(6)看到服务器端也显示文件传输完成
服务器源码:
#include<
stdio.h>
stdlib.h>
unistd.h>
string.h>
sys/types.h>
sys/stat.h>
sys/socket.h>
netinet/in.h>
#definePORT6000
#defineLISTENQ20
#defineBUFFSIZE4096
#defineFILE_NAME_MAX_SIZE512
intmain(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));
//把一段内存区的内容全部设置为0
svraddr.sin_family=AF_INET;
svraddr.sin_addr.s_addr=htonl(INADDR_ANY);
svraddr.sin_port=htons(PORT);
//创建用于internet的流协议(TCP)socket
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<
0)
perror("
socket"
exit
(1);
}
//把socket和socket地址结构绑定
if(bind(sockfd,(structsockaddr*)&
svraddr,sizeof(svraddr))<
bind"
//监听
if(listen(sockfd,LISTENQ)<
listen"
while
(1)//服务器端一直运行
socklen_tlength=sizeof(clientaddr);
//等待请求
connfd=accept(sockfd,(structsockaddr*)&
clientaddr,&
length);
if(connfd<
connect"
//发送文件信息
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(count<
Sendfileimformation"
//读取文件并发送文件
FILE*fd=fopen(filename,"
rb"
if(fd==NULL)
File:
%snotfound!
\n"
filename);
else
intfile_block_length=0;
while((file_block_length=fread(buff,sizeof(char),BUFFSIZE,fd))>
file_block_length:
%d\n"
file_block_length);
if(send(connfd,buff,file_block_length,0)<
Send"
fclose(fd);
Transferfilefinished!
close(connfd);
close(sockfd);
//关闭socket
return0;
客户端源码:
intclientfd;
if(argc!
=2)//判断参数是否完整
fprintf(stderr,"
Usage:
./fileclient<
IP_Address>
structsockaddr_inclientaddr;
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代表客户机socket
clientfd=socket(AF_INET,SOCK_STREAM,0);
if(clientfd<
0)
{
//把客户机的socket和客户机的socket地址结构联系起来
if(bind(clientfd,(structsockaddr*)&
clientaddr,sizeof(clientaddr))<
//设置一个socket地址结构体
structsockaddr_insvraddr;
if(inet_aton(argv[1],&
svraddr.sin_addr)==0)//IP地址来自程序的参数
inet_aton"
socklen_tsvraddrlen=sizeof(svraddr);
//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if(connect(clientfd,(structsockaddr*)&
svraddr,svraddrlen)<
//接收文件信息
bzero(filename,FILE_NAME_MAX_SIZE);
count=recv(clientfd,buff,BUFFSIZE,0);
recv"
strncpy(filename,buff,strlen(buff)>
strlen(buff));
Preparingrecvfile:
%s---from---%s\n"
filename,argv[1]);
//接收文件
wb+"
if(NULL==fd)
open"
intlength=0;
while(length=recv(clientfd,buff,BUFFSIZE,0))
if(length<
intwritelen=fwrite(buff,sizeof(char),length,fd);
if(writelen<
length)
write"
Receievedfile:
%sfrom%sfinished!
close(clientfd);
//关闭socket