Linux下通过socket通信实现客户端向服务器发送文件
linux下Socket通信实现文件传输!
·
通过socket通信实现客户端向服务器实现文件发送。整合好的代码如下:
Client端的代码
/*
*************************************************
*Name : send_file.c *
*Date : 2015-04-15 *
*Author : Sniper *
*Aim : Client send the file to the Server.*
*************************************************
*/
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc,char *argv[])
{
int socketfd;
struct sockaddr_in s_add,c_add;
unsigned short portnum = 0x22B8;
int len;
char buffer[BUFFER_SIZE];
FILE *fp ;
int file_block_length = 0;
/*
*Create the socket
*/
if((socketfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("Socket create error! \n");
exit(1);
}
/*
*set the address format
*/
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family = AF_INET;
/*
*change the VM address
*/
s_add.sin_addr.s_addr = inet_addr("192.168.81.122");//change the string to 32-bit internet byte.
s_add.sin_port=htons(portnum);
if (connect(socketfd,(struct sockaddr *)(&s_add),sizeof(struct sockaddr))<0)
{
printf("Connect failure!\n");
return -1;
}
else
printf("Connect Success!\n");
/*
*Send the file
*/
fp = fopen("test", "r");
if (fp == NULL)
{
printf("File: test Not Found!\n");
}
else
{
bzero(buffer, BUFFER_SIZE);
while( (file_block_length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0)
{
printf("file_block_length = %d\n", file_block_length);
/*
*Send the string to the buffer
*/
if (send(socketfd, buffer, file_block_length, 0) < 0)
{
printf("Send File:test Failed!\n");
break;
}
bzero(buffer, sizeof(buffer));
}
fclose(fp);
printf("File:test Transfer Finished!\n");
}
close(socketfd);
return 0;
}
Server端的代码:
/*
************************************************
*Name : receive_file.c *
*Date : 2015-04-15 *
*Author : Sniper *
*Aim : Service can receive more than one *
* Client that send the file.The main*
* target is to get the file. *
************************************************
*/
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <sys/socket.h>
#include <pthread.h>
int socketfd_connect = 0;
pthread_t ntid;
int len = 0;
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
void *print_message(void *arg)
{
/*
*define the buffer to receive the file
*/
int pthread_socket_connect;
int i=0;
int write_length;
FILE *fp;
char buffer[BUFFER_SIZE];
int length = 0;
bzero(buffer,BUFFER_SIZE);
pthread_socket_connect = socketfd_connect;
pthread_detach(ntid);
/*
*Receive the file
*/
fp = fopen("test","w");
if(NULL == fp )
{
printf("File:\t Can Not Open To Write\n");
exit(1);
}
while( length = recv(pthread_socket_connect,buffer,BUFFER_SIZE,0))
{
if(length < 0)
{
printf("Recieve Data From Client Failed!\n");
break;
}
/*
*write the buffer to the file
*/
write_length = fwrite(buffer,sizeof(char),length,fp);
if (write_length<length)
{
printf("File:test Write Failed\n");
break;
}
bzero(buffer,BUFFER_SIZE);
}
printf("Recieve File: test From Client Finished\n");
fclose(fp);
/******************************************************************/
pthread_exit(0);
}
int main(int argc,char *argv[])
{
int socketfd_listen;
struct sockaddr_in server_addr,client_addr;
unsigned short portnum = 0x22B8;
int err;
/*
*Create the socket
*/
if((socketfd_listen=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf("Socket create error! \n");
exit(1);
}
/*
*set the address format
*/
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr("192.168.81.122");
server_addr.sin_port=htons(portnum);
if(bind(socketfd_listen,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))<0)
{
printf("bind failure!\n");
return -1;
}
printf("bind Success!\n");
if(listen(socketfd_listen,5)<0)
{
printf("Listen failure!\n");
return -1;
}
len=sizeof(struct sockaddr);
/*
*Using the loop to send and receive the message.
*/
while(1)
{
socketfd_connect = accept(socketfd_listen, (struct sockaddr *)(&client_addr), &len);
if(socketfd_connect<0)
{
printf("accept fail !\n");
return -1;
}
err = pthread_create(&ntid,NULL,print_message,NULL);
if(err!=0)
printf("can't create pthread!\n");
}
close(socketfd_listen);
close(socketfd_connect);
return 0;
}
编译两者即可,我用了一个test为例来测试,文件内容随意自己输入。大家可以自己尝试。
上图是演示结果!
更多推荐
已为社区贡献1条内容
所有评论(0)