/*服务器代码*/
#include <netinet/in.h> /* for sockaddr_in */
#include <sys/types.h> /* for socket */
#include <sys/socket.h> /* for socket */
#include <stdio.h> /* for printf */
#include <stdlib.h> /* for exit */
#include <string.h> /* for bzero */
#include <time.h> /*for time_t and time */
#define SERVER_PORT 7754
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define SEND_FILE_NAME "test.rmvb" /* the name of file you want send */
int main(int argc, char **argv)
{
/*设置一个socket地址结构server_addr,代表服务器internet地址, 端口 */
struct sockaddr_in server_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(SERVER_PORT);
// time_t now;
FILE *stream;
/*创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket */
int server_socket = socket(AF_INET,SOCK_STREAM,0);
if( server_socket < 0)
{
printf("Create Socket Failed!");
exit(1);
}
/*把socket和socket地址结构联系起来 */
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
exit(1);
}
/*server_socket用于监听 */
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
{
printf("Server Listen Failed!");
exit(1);
}
while (1) /*服务器端要一直运行 */
{
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
/* accept connect*/
int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
if ( new_server_socket < 0)
{
printf("Server Accept Failed!/n");
break;
}
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
strcpy(buffer,"Hello,World! from server !");
strcat(buffer,"/n");
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("Server Recieve Data Failed!/n");
exit(1);
}
printf("/n%s",buffer);
/* open file */
if((stream = fopen(SEND_FILE_NAME,"r"))==NULL)
{
printf("The file 'data1' was not opened! /n");
exit(1);
}
else
printf("The file 'filename' was opened! /n");
bzero(buffer,BUFFER_SIZE);
/* read file content and send it to client */
int lengsize = 0;
while((lengsize = fread(buffer,1,1024,stream)) > 0)
{
printf("lengsize = %d/n",lengsize);
if(send(new_server_socket,buffer,lengsize,0)<0)
{
printf("Send File is Failed/n");
break;
}
bzero(buffer, BUFFER_SIZE);
}
/* close file */
if(fclose(stream))
{
printf("The file 'data' was not closed! /n");
exit(1);
}
/*关闭与客户端的连接 */
close(new_server_socket);
}
/*关闭监听用的socket */
close(server_socket);
return 0;
}
/
/*本文件是客户机的代码/ */
#include <netinet/in.h> /* for sockaddr_in */
#include <sys/types.h> /* for socket */
#include <sys/socket.h> /* for socket */
#include <stdio.h> /* for printf */
#include <stdlib.h> /* for exit */
#include <string.h> /* for bzero */
#include <time.h> /*for time_t and time*/
#include <arpa/inet.h>
#define SERVER_PORT 7754
#define BUFFER_SIZE 1024
#define RECEIVE_FILE_NAME "dest.rmvb" /* define the name of file you receive */
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: ./%s ServerIPAddress/n",argv[0]);
exit(1);
}
//time_t now;
FILE *stream;
/*设置一个socket地址结构client_addr,代表客户机internet地址, 端口*/
struct sockaddr_in client_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*/
int client_socket = socket(AF_INET,SOCK_STREAM,0);
if( client_socket < 0)
{
printf("Create Socket Failed!/n");
exit(1);
}
/*把客户机的socket和客户机的socket地址结构联系起来*/
if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
{
printf("Client Bind Port Failed!/n");
exit(1);
}
/*设置一个socket地址结构server_addr,代表服务器的internet地址, 端口*/
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) /*服务器的IP地址来自程序的参数*/
{
printf("Server IP Address Error!/n");
exit(1);
}
server_addr.sin_port = htons(SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
/*向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接*/
if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)
{
printf("Can Not Connect To %s!/n",argv[1]);
exit(1);
}
char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);
/*从服务器接收数据到buffer中*/
int length = recv(client_socket,buffer,BUFFER_SIZE,0);
if(length < 0)
{
printf("Recieve Data From Server %s Failed!/n", argv[1]);
exit(1);
}
printf("/n%s/n",buffer);
bzero(buffer,BUFFER_SIZE);
strcpy(buffer,"Hello, World! From Client/n");
/*向服务器发送buffer中的数据*/
send(client_socket,buffer,BUFFER_SIZE,0);
if((stream = fopen(RECEIVE_FILE_NAME,"w+t"))==NULL)
{
printf("The file 'data' was not opened! /n");
}
else
bzero(buffer,BUFFER_SIZE);
length = 0;
while( length = recv(client_socket,buffer,BUFFER_SIZE,0))
{
if(length < 0)
{
printf("Recieve Data From Server %s Failed!/n", argv[1]);
break;
}
int write_length = fwrite(buffer,sizeof(char),length,stream);
if (write_length<length)
{
printf("File is Write Failed/n");
break;
}
bzero(buffer,BUFFER_SIZE);
}
printf("Recieve File From Server[%s] Finished/n", argv[1]);
/*关闭 文件*/
fclose(stream);
/*关闭socket*/
close(client_socket);
return 0;
}