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;
}