2015-04-08 40 views
0

我在server.cC:TCP的recv不清除舊的數據

while (1) { 
    char msg[1024]; 
    recv(fd, msg, 1024, 0); 
} 

從客戶端下面的代碼,首先,我送的 「Hello World」。

然後我收到服務器中的「hello world」。

然後我發送「hexx」給服務器。

但我在服務器上收到「hexxo world」。

看起來好像味精沒有完全清除。

請讓我知道我做錯了什麼。

乾杯。

+0

您正在爲消息分配1024個字節,並且從不對該數據進行調零。你只是反覆讀入同一個緩衝區。首先通過它讀取「你好世界」在第二遍你把「hexx」在相同的起始地址導致「hexxo世界」 – bentank

+0

@bentank謝謝。有用。有一個問題,它總是需要bzero char數組? – moeseth

+0

這是沒有必要bzero char數組。 –

回答

3

您正在爲消息分配1024個字節,並且從不調零該數據。你只是反覆讀入同一個緩衝區。第一遍通過它讀取「hello world」在第二遍中,您將「hexx」放在相同的起始地址導致「hexxo世界」

由於DoxyLover提到你可以null終止新讀取的字符串,並得到你在找什麼對於。

1

read()不能終止緩衝區。因此,您會看到緩衝區中遺留的舊數據。

你想要的是一樣的東西:

while (1) { 
    char msg[1024]; 
    ssize_t n = recv(fd, msg, 1023, 0); 
    if (n >= 0) 
     msg[n] = '\0'; 
} 

注意,我限制讀取到一個小於緩衝區的大小,以允許空字節的空間。顯然,這隻適用於文本數據。對於二進制數據,您需要記錄來自read()的返回值,並在處理緩衝區時將其用作字節計數。例如,從一個插槽複製到另一個數據:

while (1) { 
    char msg[1024]; 
    ssize_t n = recv(fd, msg, 1024, 0); 
    if (n > 0) 
     send(second_fd, msg, n, 0); 
} 

所有這一切都非常簡單 - 你需要的錯誤檢查,檢查read()回報,以確保收到任何字節,檢查send()到返回確保所有字節都已發送,等等。

0

TCP的recv不清除舊的數據

誰說它會嗎?並不是說它應該是必要的。你無視recv().返回計數調用recv(),後,有三種可能性:

  1. 返回值-1:錯誤;請致電perror()
  2. 返回值爲0:流結束:關閉套接字並退出讀取循環。
  3. 返回值爲正值:您已經接收到您的緩衝區中的許多字節,並且您不應該認爲超出該值的任何數據都是有效的。

目前你沒有做任何正確的事情。