我在server.cC:TCP的recv不清除舊的數據
while (1) {
char msg[1024];
recv(fd, msg, 1024, 0);
}
從客戶端下面的代碼,首先,我送的 「Hello World」。
然後我收到服務器中的「hello world」。
然後我發送「hexx」給服務器。
但我在服務器上收到「hexxo world」。
看起來好像味精沒有完全清除。
請讓我知道我做錯了什麼。
乾杯。
我在server.cC:TCP的recv不清除舊的數據
while (1) {
char msg[1024];
recv(fd, msg, 1024, 0);
}
從客戶端下面的代碼,首先,我送的 「Hello World」。
然後我收到服務器中的「hello world」。
然後我發送「hexx」給服務器。
但我在服務器上收到「hexxo world」。
看起來好像味精沒有完全清除。
請讓我知道我做錯了什麼。
乾杯。
您正在爲消息分配1024個字節,並且從不調零該數據。你只是反覆讀入同一個緩衝區。第一遍通過它讀取「hello world」在第二遍中,您將「hexx」放在相同的起始地址導致「hexxo世界」
由於DoxyLover提到你可以null終止新讀取的字符串,並得到你在找什麼對於。
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()
到返回確保所有字節都已發送,等等。
TCP的recv不清除舊的數據
誰說它會嗎?並不是說它應該是必要的。你無視recv().
返回計數調用recv(),
後,有三種可能性:
perror()
。目前你沒有做任何正確的事情。
您正在爲消息分配1024個字節,並且從不對該數據進行調零。你只是反覆讀入同一個緩衝區。首先通過它讀取「你好世界」在第二遍你把「hexx」在相同的起始地址導致「hexxo世界」 – bentank
@bentank謝謝。有用。有一個問題,它總是需要bzero char數組? – moeseth
這是沒有必要bzero char數組。 –