C 回聲伺服器 2 修復客戶端問題

2021-09-12 17:07:26 字數 1643 閱讀 3951

c++回聲伺服器_1-簡單版本中的問題出在客戶端。客戶端通過write函式一次性傳送資料,過一段時間再呼叫一次read函式,期望接收傳輸的資料。問題在於這段時間到底是多久?理想的客戶端應在接收到資料時立即讀取資料。

客戶端傳送資料時,可以知道資料的大小(長度)。客戶端接收資料的時候,可以知道接收到資料的大小(長度)。所以,客戶端迴圈呼叫read函式,直到接收到的資料總大小(長度)等於傳送的資料的大小(長度)時,已完成所有資料的接收。

修改的**:

// 傳送的字串長度、接收字串的長度、每次read函式接受到字串的長度

ssize_t str_len, recv_len, recv_cnt;

str_len = write(sock, message, strlen(message)); // 向伺服器傳送資料

recv_len = 0;

// 迴圈呼叫read函式,直到接收到所有資料為止

while (recv_len < str_len)

recv_len += recv_cnt;

}message[recv_len] = 0;

完整的客戶端**:

#include #include #include #include #include #include const int buf_size = 1024;

void error_handling(const char *message);

// 接收兩個引數,ar**[1]為ip位址,ar**[2]為埠號

int main(int argc, char *ar**)

sock = socket(pf_inet, sock_stream, 0);

if (sock == -1)

// 位址資訊初始化

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = af_inet; // ipv4 位址族

server_addr.sin_addr.s_addr = inet_addr(ar**[1]); // 伺服器ip位址

server_addr.sin_port = htons(atoi(ar**[2])); // 伺服器端口號

// 向伺服器傳送連線請求

if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) else

while (1)

str_len = write(sock, message, strlen(message)); // 向伺服器傳送資料

recv_len = 0;

// 迴圈呼叫read函式,直到接收到所有資料為止

while (recv_len < str_len)

recv_len += recv_cnt;

}message[recv_len] = 0;

printf("message from server: %s \n", message);

}// 關閉連線

close(sock);

return 0;

}

github

《tcp/ip網路程式設計》

C 回聲伺服器 2 修復客戶端問題

c 回聲伺服器 1 簡單版本中的問題出在客戶端。客戶端通過write函式一次性傳送資料,過一段時間再呼叫一次read函式,期望接收傳輸的資料。問題在於這段時間到底是多久?理想的客戶端應在接收到資料時立即讀取資料。客戶端傳送資料時,可以知道資料的大小 長度 客戶端接收資料的時候,可以知道接收到資料的大...

C 回聲伺服器 2 修復客戶端問題

c 回聲伺服器 1 簡單版本中的問題出在客戶端。客戶端通過write函式一次性傳送資料,過一段時間再呼叫一次read函式,期望接收傳輸的資料。問題在於這段時間到底是多久?理想的客戶端應在接收到資料時立即讀取資料。客戶端傳送資料時,可以知道資料的大小 長度 客戶端接收資料的時候,可以知道接收到資料的大...

回聲伺服器和客戶端的實現

客戶端 include include include include include include define buf size 1024 define rlt size 4 define opsz 4 void error handling char message int main int...