服務器.c
if (retSize == -2)
{
if (send(client_sock, buf, BUF_SIZE, 0) == -1)
{
close_socket(client_sock);
close_socket(sock);
fprintf(stderr, "Error1 sending to client.\n");
return EXIT_FAILURE;
}
printf("You have sent %d msg\n", cntOfMsg);
printf("The msg is:\n %s\n", buf);
printf("------------\n");
}
else
{
if (send(client_sock, ret, BUF_SIZE, 0) == -1)
{
close_socket(client_sock);
close_socket(sock);
fprintf(stderr, "Error2 sending to client.\n");
return EXIT_FAILURE;
}
printf("You have sent %d msg\n", cntOfMsg);
printf("The msg is:\n %s\n", ret);
printf("------------\n");
}
客戶端.c
while ((bytes_received = recv(sock, buf, BUF_SIZE, 0)) > 1)
{
buf[bytes_received] = '\0';
printf("You have received %d msg\n", cnt);
fprintf(stdout, "Received:\n%s\n", buf);
printf("-----------\n");
memset(buf,0,sizeof(buf));
}
部分輸出如下圖:
注意:
像“Can't write error_log”或“syntax error”這樣的輸出與問題無關。你可以相信我顯示的代碼是唯一發送或接收的地方。
uj5u.com熱心網友回復:
TCP 發送可以根據需要對資料進行分段。如果您發送小緩沖區,TCP 可以將它們分組并在超時或收到待處理的確認后將它們作為單個資料包發送。如果您發送大緩沖區,TCP 可以將它們分成一系列較小的資料包,有利于 TCP 分段而不是 IP 分段。
TCP recv 理論上只能回傳 1 個位元組,即使您認為應該有更多資料等待。
當使用 TCP 發送記錄時,您需要使用記錄層來為每條記錄添加長度(例如,大端順序的 32 位整數)。然后接收方必須累積一個長度(理論上可以一次傳輸 1 個位元組),然后累積由該長度描述的記錄內容。接收器在累積長度和累積記錄內容之間反復進行。
在面向行的協議中,您可以使用換行符來描繪記錄邊界。如何在 TCP 位元組流中指示邊界實際上取決于您。
uj5u.com熱心網友回復:
在 each 上recv(),您只是增加cnt變數并列印,它并不代表接收到的位元組數。嘗試列印bytes_received。
同理,在send()part中,列印call的回傳值,send()而不是cntOfMsg
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/471934.html
