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...