在使用 recv 時,我總是這樣做:
int len = 1000;
int n = 0;
char buf[1000];
while(n < len) {
n = recv(socket, buf n, len - n, 0);
}
我的邏輯是,如果 recv 沒有收到完整的len位元組資料,我應該只收到其余的位元組 ( len - n) 并且不應該覆寫已經收到的資料(所以我將緩沖區的初學者偏移到已經結束收到的內容)。每當我使用它時,這似乎都能正常作業。
但是,大多數(如果不是全部)我看到的 recv 示例只是執行以下操作:
int len = 1000;
int n = 0;
char buf[1000];
while(n < len) {
n = recv(socket, buf, len, 0);
}
如果 recv 被多次呼叫,這是否不會讓您容易覆寫緩沖區的開頭?
uj5u.com熱心網友回復:
你的兩個例子都沒有考慮recv()失敗的可能性。您需要檢查錯誤的回傳值,例如:
char buf[1000];
int len = sizeof(buf);
int n = 0, ret;
while (n < len) {
ret = recv(socket, buf n, len - n, 0);
if (ret <= 0) {
// error handling...
break;
}
n = ret;
}
當您預先知道需要讀取多少位元組并且可以預先分配一個足夠大的緩沖區來容納所有位元組時,您的第一個示例很適合使用。
當您需要更動態地流式傳輸資料時,您的第二個示例很適合使用,一次 1 個緩沖區。例如,可能正在將資料保存到檔案中。或者資料太大,無法放入這么小的緩沖區,需要分塊處理。或者可能將資料附加到另一個動態增長的緩沖區以供以后使用。這個用例有很多原因,例如:
char buf[1000];
int n;
while (some condition) {
n = recv(socket, buf, sizeof(buf), 0);
if (n <= 0) {
// error handling...
break;
}
// use buf up to n bytes...
}
uj5u.com熱心網友回復:
這一切都不好。如果我們在談論 C,您至少需要為\0. 只有當您確定一切正常時,您才能將其洗掉。否則你無法測驗它。所有這些都意味著你不確定你是否可以一擊完成,所以你可能會說Transfer-Encoding: chunked。如果你不
int btx;
....
char x[9001] = {0};
int b = 0;
int e = 0;
do
{
b = recv(btx, x e, 9000, 0);
e = e b;
}while(b != 0);
和 C
std::stringstream fbtc_b;
int btx;
....
int b = 0;
do
{
char x[9000];
b = recv(btx, x, 9000, 0);
fbtc_b.write(x, b);
}while(b != 0);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/341527.html
