c 服务器传输大文件失败,linux c 利用UDP Socket编程 传输大文件时怎么传送到一半就失败了。。...

2012-12-18 回答

要下班了,时间急,不写代码了先给你一个思路

1实现最简单的udpsocket模型,实现发送一个字符串。

2实现一个简单的打开文件,读取文件的例子,如用fgets(),类似的函数有很多,然后再把读取的文件内容忘另一个文件里写(相关函数fopen(),write(),read())。

3把上面两个函数结合到一起,在客户端实现打开要传送的文件,按一定的大小读取,读取后调用sendto()发送到服务器端。在服务器端创建一个文件,然后调用recvfrom()接受客户端发送过来的数据,向来是创建的那个文件中写。

下面是改好的udp发送文件的例子。

服务器端程序的编译

gcc-ofile_serverfile_server

客户端程序的编译

gcc-ofile_clientfile_client.c

服务器程序和客户端程应当分别运行在2台计算机上.

服务器端程序的运行,在一个计算机的终端执行

./file_server

客户端程序的运行,在另一个计算机的终端中执行

./file_client运行服务器程序的计算机的ip地址

根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上

在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,

服务器端程序的运行,在一个终端执行

./file_server

客户端程序的运行,在另一个终端中执行

./file_client127.0.0.1

说明:任何计算机都可以通过127.0.0.1访问自己.也可以用计算机的实际ip地址代替127.0.0.1

//

//file_server.c文件传输顺序服务器示例

//

//本文件是服务器的代码

#include//forsockaddr_in

#include//forsocket

#include//forsocket

#include//forprintf

#include//forexit

#include//forbzero

/*

#include

#include

#include

#include

*/

#definehello_world_server_port6666

#definelength_of_listen_queue20

#definebuffer_size1024

#definefile_name_max_size512

intmain(intargc,char**argv)

{

//设置一个socket地址结构server_addr,代表服务器internet地址,端口

structsockaddr_inserver_addr,pcliaddr;

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的据报套接字(udpt,用server_socket代表服务器socket

//创建数据报套接字(udp)

intserver_socket=socket(pf_inet,sock_dgram,0);

if(server_socket<0)

{

printf("createsocketfailed!");

exit(1);

}

//把socket和socket地址结构联系起来

if(bind(server_socket,(structsockaddr*)&server_addr,sizeof(server_addr)))

{

printf("serverbindport:%dfailed!",hello_world_server_port);

exit(1);

}

while(1)//服务器端要一直运行

{

//定义客户端的socket地址结构client_addr

structsockaddr_inclient_addr;

socklen_tn=sizeof(client_addr);

intlength;

charbuffer[buffer_size];

bzero(buffer,buffer_size);

length=recvfrom(new_server_socket,buffer,buffer_size,0,&pcliaddr,&n);

if(length<0)

{

printf("serverrecievedatafailed!\n");

break;

}

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)

{

printf("file:\t%snotfound\n",file_name);

}

else

{

bzero(buffer,buffer_size);

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))>0)

{

printf("file_block_length=%d\n",file_block_length);

//发送buffer中的字符串到new_server_socket,实际是给客户端

if(send(new_server_socket,buffer,file_block_length,0)<0)

{

printf("sendfile:\t%sfailed\n",file_name);

break;

}

bzero(buffer,buffer_size);

}

//close(fp);

fclose(fp);

printf("file:\t%stransferfinished\n",file_name);

}

}

}

//

//file_client.c文件传输客户端程序示例

//

//本文件是客户机的代码

#include//forsockaddr_in

#include//forsocket

#include//forsocket

#include//forprintf

#include//forexit

#include//forbzero

/*

#include

#include

#include

#include

*/

#definehello_world_server_port6666

#definebuffer_size1024

#definefile_name_max_size512

intmain(intargc,char**argv)

{

if(argc!=2)

{

printf("usage:./%sserveripaddress\n",argv[0]);

exit(1);

}

//设置一个socket地址结构client_addr,代表客户机internet地址,端口

structsockaddr_inclient_addr;

bzero(&client_addr,sizeof(client_addr));//把一段内存区的内容全部设置为0

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_dgram,0);

if(client_socket<0)

{

printf("createsocketfailed!\n");

exit(1);

}

//设置一个socket地址结构server_addr,代表服务器的internet地址,端口

structsockaddr_inserver_addr;

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family=af_inet;

if(inet_aton(argv[1],&server_addr.sin_addr)==0)//服务器的ip地址来自程序的参数

{

printf("serveripaddresserror!\n");

exit(1);

}

server_addr.sin_port=htons(hello_world_server_port);

socklen_tserver_addr_length=sizeof(server_addr);

charfile_name[file_name_max_size+1];

bzero(file_name,file_name_max_size+1);

printf("pleaseinputfilenameonserver:\t");

scanf("%s",file_name);

charbuffer[buffer_size];

bzero(buffer,buffer_size);

strncpy(buffer,file_name,strlen(file_name)>buffer_size?buffer_size:strlen(file_name));

//向服务器发送buffer中的数据

socklen_tn=sizeof(server_addr);

sendto(client_socket,buffer,buffer_size,0,(structsockaddr*)&server_addr,n);

//intfp=open(file_name,o_wronly|o_creat);

//if(fp<0)

file*fp=fopen(file_name,"w");

if(null==fp)

{

printf("file:\t%scannotopentowrite\n",file_name);

exit(1);

}

//从服务器接收数据到buffer中

bzero(buffer,buffer_size);

intlength=0;

while(length=recv(client_socket,buffer,buffer_size,0))

{

if(length<0)

{

printf("recievedatafromserver%sfailed!\n",argv[1]);

break;

}

//intwrite_length=write(fp,buffer,length);

intwrite_length=fwrite(buffer,sizeof(char),length,fp);

if(write_length

{

printf("file:\t%swritefailed\n",file_name);

break;

}

bzero(buffer,buffer_size);

}

printf("recievefile:\t%sfromserver[%s]finished\n",file_name,argv[1]);

return0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值