2013-10-18 55 views
1

我正在實現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個字節..現在處於不可靠的情況下,我應該如何設法獲得另外兩個字節......我花了時間試着......任何幫助歡迎。

+0

那麼到目前爲止你對'recvall()有什麼瞭解?對於這種情況,通常你可以直接讀取流,直到你沒有更多的數據。您仍然需要處理我們意外地讀取下一個數據的情況,但是,您應該在發送的數據或分隔符中輸入一個長度。 – justhalf

+0

TCP只是一個字節流。如果您需要對這些字節的塊應用某些含義(例如,您想發送「消息」並接收「消息」),那麼您需要向流中添加足夠的信息(即先發送長度或者發送終止字節否則爲有效值)或者同意一個協議(所有消息都是14個字節長,或者每個消息具有消息類型*暗示*將會是多長) –

回答

0

您可以通過適當的超時循環select。選擇將等待,直到收到新數據,或者直到時間過去或發生錯誤。這給你一個更大的控制,而不僅僅是一個recv。

+0

但選擇是監視多個文件描述符以讀取或寫入以..我的情況是不同的。 –

+0

select是通用的,您可以在單個文件或套接字上使用它並利用超時。 –

+0

你可以看看這個很好的參考http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html –

相關問題