////////////////////////////////////
//伺服器代碼
///////////////////////////////////
//本檔案是伺服器的代碼
#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
HELLO_WORLD_SERVER_PORT 7754
#define LENGTH_OF_LISTEN_QUEUE 20
#define
BUFFER_SIZE 1024
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(HELLO_WORLD_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);
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! 從伺服器來!");
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("Server Recieve Data
Failed!/n");
exit(1);
}
printf("/n%s",buffer);
if((stream =
fopen("data1","r"))==NULL)
{
printf("The file 'data1' was
not opened! /n");
exit(1);
}
else
printf("The file 'filename' was opened! /n");
bzero(buffer,BUFFER_SIZE);
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);
}
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 HELLO_WORLD_SERVER_PORT 7754
#define
BUFFER_SIZE 1024
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(HELLO_WORLD_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);
bzero(buffer,BUFFER_SIZE);
strcpy(buffer,"Hello, World! From Client/n");
//向伺服器發送buffer中的資料
send(client_socket,buffer,BUFFER_SIZE,0);
if((stream =
fopen("data","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;
}