Linux C 回射伺服器

2021-08-16 14:56:05 字數 4055 閱讀 8320

回射伺服器就是服務端將客戶端的資料傳送回去。

我實現的回射伺服器返回增加了時間。

服務端**,可以很容易看懂:

[cpp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define max_buffer 512

typedef

struct

sockaddr ssa;  

char

timebuffer[50];  

//儲存時間

char

readbuffer[max_buffer];   

//儲存客戶端資料

time_t

tick;  

//任務類

class

task  

~task(){}  

void

doit()  

//執行緒池呼叫函式

readbuffer[readsize] = '\0'

;   

tick = time(null); //獲取時間

snprintf(timebuffer, sizeof

(timebuffer), 

"time : %.24s\r\n"

,   

ctime(&tick));  

strcat(readbuffer, timebuffer);  //時間與客戶資料連線到一起

write(connfd, readbuffer, strlen(readbuffer));  //傳送給客戶端

}  //  printf("close the connfd\n");

//  fflush(stdout);

close(connfd);  

}  };  

intmain(

intargc, 

char

*argv)  

intsockfd, connfd;  

struct

sockaddr_in serv_addr, cli_addr;  

intport = atoi(argv[1]);  

//初始化sockaddr_in

serv_addr.sin_family = af_inet;  

serv_addr.sin_port = htons(port);  

serv_addr.sin_addr.s_addr = htonl(inaddr_any);  //允許任何人連線

//建立套接字

sockfd = socket(af_inet, sock_stream, 0);  

if(sockfd < 0)  

//繫結

bind(sockfd, (ssa *)&serv_addr, sizeof

(serv_addr));  

//監聽套接字

listen(sockfd, 6);  

//建立執行緒池

threadpoolpool(60, 100);  

pool.start();  //開啟執行緒池

while

(1)  

return

0;  

}  下面的是客戶端的**:

[cpp]view plain

copy

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

intmain(

intargc, 

char

*argv)  

intsockfd;  

struct

sockaddr_in serv_addr;  

intport = atoi(argv[2]);  

//將字串的埠轉換稱int

//初始化服務端的埠和ip位址

serv_addr.sin_family = af_inet;  

serv_addr.sin_port = htons(port);  //將主機位元組序轉換稱網路位元組序

inet_pton(af_inet, argv[1], &serv_addr.sin_addr);  

//建立套接字

sockfd = socket(af_inet, sock_stream, 0);  

//連線

connect(sockfd, (struct

sockaddr *)&serv_addr,   

sizeof

(serv_addr));  

char

buffer[50];  

write(sockfd, "hello\n"

, 6);  

//寫資料

shutdown(sockfd, shut_wr);  //解釋在下面

size_t

num = read(sockfd, buffer, 

sizeof

(buffer));  

//讀資料

buffer[num] = '\0'

;  printf("read: %s\n"

, buffer);  

shutdown(sockfd, shut_rd);  

//    close(sockfd);

return

0;  

}  客戶端一開始我使用的是最後來個close的,就是注釋那部分,但是多個連線同時來的時候,服務端會出錯,具體的出錯資訊是:connection reset by peer,重新執行read之後,得到hello的個數沒有少,也就是客戶端傳送的個數。

然而我客戶端寫完資料,就關閉寫端,讀取完資料,再關閉讀端,就不會出現這樣的錯誤。

具體原因還不是很清楚,網上沒有查詢到具體的答案。求大神來解答!!~~

*********************************************=

終於知道原因了,出錯的是在服務端的read函式,read返回-1,而在客戶端,傳送完資料,就shutdown寫端,傳送完資料,就會傳送fin包,服務端read返回0,因為read不止被呼叫一次,第一次讀取完資料之後,繼續讀取,可是客戶端沒有資料可讀,就會出錯,而提前關閉客戶端寫端,所以read那裡的while退出,就沒有了出錯的資訊。

同時寫了兩個shell檔案來測試:

[html]view plain

copy

#!/bin/bash  

for i in `seq 2000`   

do  

./client.out 127.0.0.1 8989  

done  

迴圈 執行2000次。

第二個shell檔案:

[html]view plain

copy

#!/bin/bash  

./loop.sh >

file1 &  

./loop.sh >

file2 &  

./loop.sh >

file3 &  

./loop.sh >

file4 &  

./loop.sh >

file5 &  

wait  

開啟5個程序來返問。

執行第二個shell檔案

最終,耗時為:

[html]view plain

copy

real    0m7.589s  

user    0m0.460s  

sys 0m1.944s  

而且五個file檔案中,有hello的行數數都為2000.

TCP 回射伺服器

tcp reflect server client tcp回射伺服器。學習了 unp 的第五章前面的知識,自己把 敲出來了,加深了理解吧。簡單地說就是,client傳送給server一條訊息 一行文字 server再將同樣地訊息傳送回client。就像這樣 用到的函式和api包括 1 socket ...

TCP 回射伺服器

本例為多程序的 tcp 回射程式 服務端 include intmain int argc,char ar close connfd 父程序斷開連線 void str echo int sockfd 套接字 sockaddr in cliaddr,servaddr 網際套接字位址結構,包含協議族 i...

epoll實現回射伺服器

使用 epoll 寫的回射伺服器 將從client中接收到的資料再返回給client include include include include include include include include include using namespace std define maxline ...