引自:http://hi.baidu.com/lewutian/blog/item/881ae9f0c62d1bc87931aa19.html
linux是客户端,window是服务器端.通信socket编程把linux下的图片传到服务器
在linux客户端: 定义一个socket地址结构
//设置一个socket地址结构send_addr,代表发送端internet地址, 端口
struct sockaddr_in send_addr;
bzero(&send_addr,sizeof(send_addr)); //把一段内存区的内容全部设置为0
send_addr.sin_family = AF_INET;
send_addr.sin_addr.s_addr = htons(INADDR_ANY);
send_addr.sin_port = htons(0);//系统自动获取端口
再定义一个socket:
//创建用于internet的流协议(TCP)socket,用send_socket代表服务器socket
int send_socket = socket(PF_INET,SOCK_STREAM,0);
绑定socket与socket地址
bind(send_socket,(struct sockaddr*)&send_addr,sizeof(send_addr))
把数据发送给接收端,既服务器
while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0)//读取文件信息到buffer
{
printf("file_block_length = %d/n",file_block_length);
//发送buffer中的字符串到send_socket,实际是给接收端,服务端
if(send(send_socket,buffer,file_block_length,0)<0)
{
printf("Send File:/t%s Failed/n", file_name);
break;
}
bzero(buffer, BUFFER_SIZE);
}
客户端程序基本编写完毕.
服务器端:
memset(&receive_addr,0,sizeof(struct sockaddr_in)); //
receive_addr.sin_family = AF_INET;
receive_addr.sin_addr.s_addr = htons(INADDR_ANY);
receive_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
/* 服务器端开始建立socket描述符 */
receive_socket=socket(AF_INET,SOCK_STREAM,0);
if( receive_socket < 0)
{
if (WSAGetLastError() == WSANOTINITIALISED)
{
printf("Error:WSANOTINITIALISED,please Call WSAStartup first/n");
return 0;
}
else
{
int err =WSAGetLastError();
printf("Bind error:%s,errorcode :%d/n",strerror(errno),err);
return 0;
}
}
//
if( bind(receive_socket,(struct sockaddr*)&receive_addr,sizeof(receive_addr)))
{
int err = WSAGetLastError();
printf("Bind error:%s,errorcode :%d/n",(const char *)strerror(errno),err);
return 0;
}
//
if ( listen(receive_socket, LENGTH_OF_LISTEN_QUEUE) )
{
printf("Listen error:%s/n/a",strerror(errno));
return 0;
}
while (1) //
{
//
struct sockaddr_in send_addr;
length = sizeof(send_addr);
new_server_socket = accept(receive_socket,(struct sockaddr*)&send_addr,&length);
if ( new_server_socket == INVALID_SOCKET)
{
printf("Accept error:%s/n/a",strerror(errno));
break;
}
printf("the remote ip is %s/n",inet_ntoa(send_addr.sin_addr));
memset(buffer,0,BUFFER_SIZE); //
length = recv(new_server_socket,buffer,BUFFER_SIZE,0);//
if (length < 0)
{
printf("Server Recieve Data Failed!/n");
break;
}
memset(file_name,0, FILE_NAME_MAX_SIZE+1);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
printf("filename is %s/n",file_name);
fp = fopen(file_name,"wb");//以二进制打开
if(NULL == fp )
{
printf("File:/t%s Can Not Open To Write/n", file_name);
exit(1);
}
//
memset(buffer,0,BUFFER_SIZE);
lengther = 0;
while( lengther = recv(new_server_socket,buffer,BUFFER_SIZE,0))
{
//printf("the lengther is %d/n",lengther);
if(lengther < 0)
{
printf("Recieve Data From Server Failed!/n");
break;
}
//printf("buffer size is %d/n",strlen(buffer));
write_length = fwrite(buffer,sizeof(char),lengther,fp);
if (write_length<lengther)
{
printf("File:/t%s Write Failed/n", file_name);
break;
}
memset(buffer,0,BUFFER_SIZE);
lengther=0;
}
printf("Recieve File:/t %s From Server Finished/n",file_name);
fclose(fp);
closesocket(new_server_socket);
}