linux下C语言实现文件传输的简单实例详解Word格式.docx

上传人:b****6 文档编号:21190898 上传时间:2023-01-28 格式:DOCX 页数:6 大小:16.45KB
下载 相关 举报
linux下C语言实现文件传输的简单实例详解Word格式.docx_第1页
第1页 / 共6页
linux下C语言实现文件传输的简单实例详解Word格式.docx_第2页
第2页 / 共6页
linux下C语言实现文件传输的简单实例详解Word格式.docx_第3页
第3页 / 共6页
linux下C语言实现文件传输的简单实例详解Word格式.docx_第4页
第4页 / 共6页
linux下C语言实现文件传输的简单实例详解Word格式.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

linux下C语言实现文件传输的简单实例详解Word格式.docx

《linux下C语言实现文件传输的简单实例详解Word格式.docx》由会员分享,可在线阅读,更多相关《linux下C语言实现文件传输的简单实例详解Word格式.docx(6页珍藏版)》请在冰豆网上搜索。

linux下C语言实现文件传输的简单实例详解Word格式.docx

//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);

本文档局部内容来源于网络,如有内容侵权请告知删除,感谢您的配合!

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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