linux下C语言实现文件传输的简单实例详解Word格式.docx
- 文档编号:21190898
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:6
- 大小:16.45KB
linux下C语言实现文件传输的简单实例详解Word格式.docx
《linux下C语言实现文件传输的简单实例详解Word格式.docx》由会员分享,可在线阅读,更多相关《linux下C语言实现文件传输的简单实例详解Word格式.docx(6页珍藏版)》请在冰豆网上搜索。
//forexit
string.h>
//forbzero
/*
sys/stat.h>
fcntl.h>
unistd.h>
*/
#defineHELLO_WORLD_SERVER_PORT
6666
#defineLENGTH_OF_LISTEN_QUEUE
20
#defineBUFFER_SIZE1024
#defineFILE_NAME_MAX_SIZE512
intmain(intargc,char**argv)
{
//设置一个socket地址结构server_addr,代表效劳器internet地址,端口
structsockaddr_inserver_addr;
bzero(&
server_addr,sizeof(server_addr));
//把一段内存区的内容全部设置为0
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htons(INADDR_ANY);
server_addr.sin_port=htons(HELLO_WORLD_SERVER_PORT);
//创立用于internet的流协议(TCP)socket,用server_socket代表效劳器socket
intserver_socket=socket(PF_INET,SOCK_STREAM,0);
if(server_socket<
0)
{
printf("
CreateSocketFailed!
"
);
exit
(1);
}
//把socket和socket地址结构联系起来
if(bind(server_socket,(structsockaddr*)&
server_addr,sizeof(server_addr)))
ServerBindPort:
%dFailed!
HELLO_WORLD_SERVER_PORT);
//server_socket用于监听
if(listen(server_socket,LENGTH_OF_LISTEN_QUEUE))
ServerListenFailed!
while
(1)//效劳器端要一直运行
//定义客户端的socket地址结构client_addr
structsockaddr_inclient_addr;
socklen_tlength=sizeof(client_addr);
//接受一个到server_socket代表的socket的一个连接
//如果没有连接请求,就等待到有连接请求--这是accept函数的特性
//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
//new_server_socket代表了效劳器和客户端之间的一个通信通道
//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
intnew_server_socket=accept(server_socket,(structsockaddr*)&
client_addr,&
length);
if(new_server_socket<
ServerAcceptFailed!
\n"
break;
charbuffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
length=recv(new_server_socket,buffer,BUFFER_SIZE,0);
//这里先接收客户端发来的要获取的文件名
if(length<
ServerRecieveDataFailed!
charfile_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name,FILE_NAME_MAX_SIZE+1);
strncpy(file_name,buffer,strlen(buffer)>
FILE_NAME_MAX_SIZE?
FILE_NAME_MAX_SIZE:
strlen(buffer));
//
intfp=open(file_name,O_RDONLY);
if(fp<
0)
FILE*fp=fopen(file_name,"
r"
if(NULL==fp)
File:
\t%sNotFound\n"
file_name);
else
intfile_block_length=0;
while((file_block_length=read(fp,buffer,BUFFER_SIZE))>
0)
while((file_block_length=fread(buffer,sizeof(char),BUFFER_SIZE,fp))>
file_block_length=%d\n"
file_block_length);
//发送buffer中的字符串到new_server_socket,实际是给客户端
if(send(new_server_socket,buffer,file_block_length,0)<
SendFile:
\t%sFailed\n"
}
//这段代码是循环读取文件的一段数据,在循环调用send,发送到客户端,这里强调一点的TCP每次接受最多是1024字节,多了就会分片,因此每次发送时尽量不要超过1024字节。
close(fp);
fclose(fp);
\t%sTransferFinished\n"
file_name);
//关闭与客户端的连接
close(new_server_socket);
//关闭监听用的socket
close(server_socket);
return0;
}
//file_client.c
文件传输客户端程序例如
//本文件是客户机的代码
if(argc!
=2)
Usage:
./%sServerIPAddress\n"
argv[0]);
//设置一个socket地址结构client_addr,代表客户机internet地址,端口
client_addr,sizeof(client_addr));
client_addr.sin_family=AF_INET;
//internet协议族
client_addr.sin_addr.s_addr=htons(INADDR_ANY);
//INADDR_ANY表示自动获取本机地址
client_addr.sin_port=htons(0);
//0表示让系统自动分配一个空闲端口
//创立用于internet的流协议(TCP)socket,用client_socket代表客户机socket
intclient_socket=socket(AF_INET,SOCK_STREAM,0);
if(client_socket<
//把客户机的socket和客户机的socket地址结构联系起来
if(bind(client_socket,(structsockaddr*)&
client_addr,sizeof(client_addr)))
ClientBindPortFailed!
//设置一个socket地址结构server_addr,代表效劳器的internet地址,端口
if(inet_aton(argv[1],&
server_addr.sin_addr)==0)//效劳器的IP地址来自程序的参数
ServerIPAddressError!
socklen_tserver_addr_length=sizeof(server_addr);
//向效劳器发起连接,连接成功后client_socket代表了客户机和效劳器的一个socket连接
if(connect(client_socket,(structsockaddr*)&
server_addr,server_addr_length)<
CanNotConnectTo%s!
argv[1]);
PleaseInputFileNameOnServer:
\t"
scanf("
%s"
bzero(buffer,BUFFER_SIZE);
strncpy(buffer,file_name,strlen(file_name)>
BUFFER_SIZE?
BUFFER_SIZE:
strlen(file_name));
//向效劳器发送buffer中的数据
send(client_socket,buffer,BUFFER_SIZE,0);
intfp=open(file_name,O_WRONLY|O_CREAT);
w"
\t%sCanNotOpenToWrite\n"
//从效劳器接收数据到buffer中
intlength=0;
while(length=recv(client_socket,buffer,BUFFER_SIZE,0))
//循环接收,再写到文件
if(length<
RecieveDataFromServer%sFailed!
argv[1]);
intwrite_length=write(fp,buffer,length);
intwrite_length=fwrite(buffer,sizeof(char),length,fp);
if(write_length<
length)
\t%sWriteFailed\n"
RecieveFile:
\t%sFromServer[%s]Finished\n"
file_name,argv[1]);
//关闭socket
close(client_socket);
本文档局部内容来源于网络,如有内容侵权请告知删除,感谢您的配合!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 语言 实现 文件传输 简单 实例 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)