C语言实现Linux下的socket文件传输实例
本文实例讲述了C语言实现Linux下的socket文件传输。分享给大家供大家参考。具体如下:
server.c如下:
////////////////////////////////////
//服务器代码
///////////////////////////////////
//本文件是服务器的代码
#include<netinet/in.h>//forsockaddr_in
#include<sys/types.h>//forsocket
#include<sys/socket.h>//forsocket
#include<stdio.h>//forprintf
#include<stdlib.h>//forexit
#include<string.h>//forbzero
#include<time.h>//fortime_tandtime
#defineHELLO_WORLD_SERVER_PORT7754
#defineLENGTH_OF_LISTEN_QUEUE20
#defineBUFFER_SIZE1024
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);
//time_tnow;
FILE*stream;
//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
intserver_socket=socket(AF_INET,SOCK_STREAM,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);
}
//server_socket用于监听
if(listen(server_socket,LENGTH_OF_LISTEN_QUEUE))
{
printf("ServerListenFailed!");
exit(1);
}
while(1)//服务器端要一直运行
{
structsockaddr_inclient_addr;
socklen_tlength=sizeof(client_addr);
intnew_server_socket=accept(server_socket,(structsockaddr*)&client_addr,&length);
if(new_server_socket<0)
{
printf("ServerAcceptFailed!\n");
break;
}
charbuffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
strcpy(buffer,"Hello,World!从服务器来!");
strcat(buffer,"\n");//C语言字符串连接
send(new_server_socket,buffer,BUFFER_SIZE,0);
bzero(buffer,BUFFER_SIZE);
//接收客户端发送来的信息到buffer中
length=recv(new_server_socket,buffer,BUFFER_SIZE,0);
if(length<0)
{
printf("ServerRecieveDataFailed!\n");
exit(1);
}
printf("\n%s",buffer);
if((stream=fopen("data1","r"))==NULL)
{
printf("Thefile'data1'wasnotopened!\n");
exit(1);
}
else
printf("Thefile'filename'wasopened!\n");
bzero(buffer,BUFFER_SIZE);
intlengsize=0;
while((lengsize=fread(buffer,1,1024,stream))>0)
{
printf("lengsize=%d\n",lengsize);
if(send(new_server_socket,buffer,lengsize,0)<0)
{
printf("SendFileisFailed\n");
break;
}
bzero(buffer,BUFFER_SIZE);
}
if(fclose(stream))
printf("Thefile'data'wasnotclosed!\n");
exit(1);
//关闭与客户端的连接
close(new_server_socket);
}
//关闭监听用的socket
close(server_socket);
return0;
}
client.c如下:
////////////////////////////////////
//客户端代码
///////////////////////////////////
//本文件是客户机的代码
#include<netinet/in.h>//forsockaddr_in
#include<sys/types.h>//forsocket
#include<sys/socket.h>//forsocket
#include<stdio.h>//forprintf
#include<stdlib.h>//forexit
#include<string.h>//forbzero
#include<time.h>//fortime_tandtime
#include<arpa/inet.h>
#defineHELLO_WORLD_SERVER_PORT7754
#defineBUFFER_SIZE1024
intmain(intargc,char**argv)
{
if(argc!=2)
{
printf("Usage:./%sServerIPAddress\n",argv[0]);
exit(1);
}
//time_tnow;
FILE*stream;
//设置一个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_STREAM,0);
if(client_socket<0)
{
printf("CreateSocketFailed!\n");
exit(1);
}
//把客户机的socket和客户机的socket地址结构联系起来
if(bind(client_socket,(structsockaddr*)&client_addr,sizeof(client_addr)))
{
printf("ClientBindPortFailed!\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);
//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接
if(connect(client_socket,(structsockaddr*)&server_addr,server_addr_length)<0)
{
printf("CanNotConnectTo%s!\n",argv[1]);
exit(1);
}
charbuffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
//从服务器接收数据到buffer中
intlength=recv(client_socket,buffer,BUFFER_SIZE,0);
if(length<0)
{
printf("RecieveDataFromServer%sFailed!\n",argv[1]);
exit(1);
}
printf("\n%s\n",buffer);
bzero(buffer,BUFFER_SIZE);
bzero(buffer,BUFFER_SIZE);
strcpy(buffer,"Hello,World!FromClient\n");
//向服务器发送buffer中的数据
send(client_socket,buffer,BUFFER_SIZE,0);
if((stream=fopen("data","w+t"))==NULL)
{
printf("Thefile'data'wasnotopened!\n");
}
else
bzero(buffer,BUFFER_SIZE);
length=0;
while(length=recv(client_socket,buffer,BUFFER_SIZE,0))
{
if(length<0)
{
printf("RecieveDataFromServer%sFailed!\n",argv[1]);
break;
}
intwrite_length=fwrite(buffer,sizeof(char),length,stream);
if(write_length<length)
{
printf("FileisWriteFailed\n");
break;
}
bzero(buffer,BUFFER_SIZE);
}
printf("RecieveFileFromServer[%s]Finished\n",argv[1]);
//关闭文件
fclose(stream);
//关闭socket
close(client_socket);
return0;
}
希望本文所述对大家的C语言程序设计有所帮助。