我正在實現recvall()函數以確保數據完全發送。我也修改send()函數sendall()像這樣:如何確保recv()在tcp中發送所有數據()
int sendall (int consocket, char* buf, int* len)
{
int total = 0;
int bytesleft = *len; // how many we have left to send
int n;
while(total < *len) {
n = send(consocket, buf+total, bytesleft, 0);
if (n == -1) { break; }
total += n;
bytesleft -= n;
*len = total; // return number actually sent here
return n==-1?-1:0; // return -1 on failure, 0 on success
}
}
我該如何實現recvall()?假設我從服務器發送了一個14字節的結構體,並且檢入了客戶機並獲得了12個字節..現在處於不可靠的情況下,我應該如何設法獲得另外兩個字節......我花了時間試着......任何幫助歡迎。
那麼到目前爲止你對'recvall()有什麼瞭解?對於這種情況,通常你可以直接讀取流,直到你沒有更多的數據。您仍然需要處理我們意外地讀取下一個數據的情況,但是,您應該在發送的數據或分隔符中輸入一個長度。 – justhalf
TCP只是一個字節流。如果您需要對這些字節的塊應用某些含義(例如,您想發送「消息」並接收「消息」),那麼您需要向流中添加足夠的信息(即先發送長度或者發送終止字節否則爲有效值)或者同意一個協議(所有消息都是14個字節長,或者每個消息具有消息類型*暗示*將會是多長) –