的recv會返回。如果您請求100個字節,它不會等到有100個字節。
如果您要發送100字節的「消息」,請記住,TCP不提供的消息,它只是流。如果您正在處理應用程序消息,則需要在應用程序層處理該消息,因爲TCP不會這樣做。
有其中的100個字節的發送()調用可能還沒有完全在另一端調用時只有一個recv調用的recv(...,100)讀很多很多的條件;這裏只是一個幾個例子:
發送TCP堆棧決定束15個寫入調用在一起,MTU正好是1460,這 - 這取決於到達的數據的時序可能導致前14個客戶端調用獲取100個字節,調用15.獲取60個字節 - 最後40個字節將在下一次調用recv()時出現。(但是如果你用100的緩衝區調用recv,你可能會得到前一個應用程序的最後40個字節「消息」和下一個消息的前60個字節)
發送緩衝區已滿,也許讀者速度緩慢,或者網絡擁塞。在某些時候,數據可能會通過,同時清空緩衝區,最後一塊數據不是100的倍數。
接收緩衝區已滿,而您的應用程序recv()該數據,最後一個塊因爲該消息的整個100個字節不適合緩衝區,所以拉起僅僅是部分的。
許多場景都比較難以測試,特別是在一個局域網裏,你可能不會有很多擁塞或包丟失的 - 當你上升和下降的速度,發送消息的事情可能會有所不同/生產。
無論如何。如果你想從一個套接字讀取100個字節,使用類似
int
readn(int f, void *av, int n)
{
char *a;
int m, t;
a = av;
t = 0;
while(t < n){
m = read(f, a+t, n-t);
if(m <= 0){
if(t == 0)
return m;
break;
}
t += m;
}
return t;
}
...
if(readn(mysocket,buffer,BUFFER_SZ) != BUFFER_SZ) {
//something really bad is going on.
}
來源
2010-02-19 12:39:27
nos
感謝您的詳細解釋。只需確認是否對* blocking * recv()調用也是如此? (即recv()返回的請求字節數小於) – Adil 2010-02-19 13:03:31
是的,這對阻塞recv呼叫是正確的。 – nos 2010-02-19 18:25:32