TCP可以任意合併和拆分數據包。因此,假設我這樣做,例如,這樣的電話:當我請求更多的數據比立即可用的時候`recv`會阻塞在TCP套接字上嗎?
`recv(sock, buf, 15, 0)`
但此時此刻只有5
字節的數據立即可用 -
威爾recv()
塊,直到15
字節的數據是可用的,或將我只能得到5
字節?
我這麼問是因爲我想知道如果我能讀,例如uint32_t
只是這樣(假設i
是uint32_t
類型的變量):
if(recv(sock, &i, sizeof(uint32_t), 0) < sizeof(uint32_t)) {
/* error */
}
i = ntohl(i);
還是我,而必須做這樣的事情:
unsigned char buff[sizeof(uint32_t)];
ssize_t read_already = 0;
while(read_already != sizeof(uint32_t)) {
ssize_t read_now = recv(sock, buff, sizeof(uint32_t)-read_already, 0);
if(read_now == -1) {
/* error */
}
else {
read_already += read_now;
}
}
memcpy(&i, buff, sizeof(uint32_t));
i = ntohl(i);
後者是明顯醜陋,更艱鉅,但可悲的是必要的,如果recv()
不會阻止,直到它接收所有請求的數據的情況下,該軟件包被拆分。
謝謝。那麼,我的第二個片段的醜陋和艱辛是不是逃不過? – gaazkam
'MSG_WAITALL'可能會滿足您的需求。你的代碼段中存在一個錯誤(你沒有在你的問題中對「buff」進行指針計算)。查看我提供的代碼示例。 – selbie