server.c
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_SERVER_PORT 1234
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(FILE_SERVER_PORT);
int server_socket = socket(AF_INET,SOCK_STREAM,0);
if(server_socket < 0)
{
printf("Create Socket Failed!\n");
exit(1);
}
if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!\n",FILE_SERVER_PORT);
exit(1);
}
if(listen(server_socket,LENGTH_OF_LISTEN_QUEUE))
{
printf("Server Listen Failed!\n");
exit(1);
}
while(1)
{
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
if(new_server_socket < 0)
{
printf("Server Recieve Data Falied!\n");
break;
}
char buffer[BUFFER_SIZE];
bzero(buffer,sizeof(buffer));
length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
if(length < 0)
{
printf("Server Recieve Data Failed!\n");
break;
}
char file_name[FILE_NAME_MAX_SIZE + 1];
bzero(file_name,sizeof(file_name));
strncpy(file_name,buffer,strlen(buffer) > FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE : strlen(buffer));
FILE *fp = fopen(file_name,"r");
if(fp = NULL)
{
printf("File :%s Not Found!\n",file_name);
}
else
{
bzero(buffer,BUFFER_SIZE);
int file_block_length = 0;
while((file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp)) > 0)
{
printf("file_block_length = %d\n",file_block_length);
if(send(new_server_socket,buffer,file_block_length,0) < 0)
{
printf("Send file: %s Failed\n",file_name);
break;
}
bzero(buffer,sizeof(buffer));
}
fclose(fp);
printf("File: %s Transfer Finished!\n",file_name);
}
close(new_server_socket);
}
close(server_socket);
return 0;
}
client.c
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_SERVER_PORT 8080
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: %s ServerIPAddress",argv[0]);
exit(1);
}
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr = htons(INADDR_ANY);
client_addr.sin_port = htons(0);
int client_socket = socket(AF_INET,SOCK_STREAM,0);
if(client_socket < 0)
{
printf("Create Socket Failed!\n");
exit(1);
}
if(bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
{
printf("Client Bind Port Falied!\n");
exit(1);
}
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(argv[1],&server_addr.sin_addr) == 0)
{
printf("Server IP address Error!\n");
exit(1);
}
server_addr.sin_port = htons(FILE_SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
if(connect(client_socket,(struct sockaddr*)&server_addr,server_addr_length) < 0)
{
printf("Can Not Connect To %s !\n",argv[1]);
exit(1);
}
char file_name[FILE_NAME_MAX_SIZE + 1];
bzero(file_name,sizeof(file_name));
printf("Please Input File Name On Server.");
scanf("%s",file_name);
char buffer[BUFFER_SIZE];
bzero(buffer,sizeof(buffer));
strncpy(buffer,file_name,strlen(file_name) > BUFFER_SIZE ? BUFFER_SIZE : strlen(file_name));
send(client_socket,buffer,BUFFER_SIZE,0);
FILE *fp = fopen(file_name,"w");
if(fp ==NULL)
{
printf("File: %s Can Not Open To Write!\n",file_name);
exit(1);
}
bzero(buffer,sizeof(buffer));
int length = 0;
while(length = recv(client_socket,buffer,BUFFER_SIZE,0))
{
if(length < 0)
{
printf("Revieve Data From Server %d Failed!\n",argv[1]);
break;
}
int write_length = fwrite(buffer,sizeof(char),length,fp);
if(write_length < length)
{
printf("File: %s Write Failed!\n",file_name);
break;
}
bzero(buffer,BUFFER_SIZE);
}
printf("Recieve file: %s From Derver[%s] Finished!\n",file_name,argv[1]);
fclose(fp);
close(client_socket);
return 0;
}