2012-08-30 67 views
0

我想收到一串數據。所以有時數據可能會枯竭。在那種情況下,如果Receive方法返回到目前爲止所收到的內容,那將會很不錯。將流式傳輸Socket.Receive塊,直到它填充緩衝區?

當我使用.Net Socket,我把它稱爲Receive方法,將調用塊,直到它能夠完全填充緩衝區?或者一旦能夠返回至少1個字節,它會立即返回? (假設套接字未關閉)

難道問題,如果我通過一個尺寸參數明確?異步方法BeginReceive會有什麼影響嗎? (我猜在這兩種情況下,行爲將是相同的)

當閱讀this answer時,似乎你應該總是期望緩衝區被填滿,因爲它建議你做一個while (bytesRead == bytesRequested)。但the MSDN documentation中的一個示例使用了一個while (bytesRead > 0)

回答

1

網絡堆棧將爲您提供可用(在內核中緩衝)和您提供的應用程序緩衝區大小的最小值。這裏的技巧是,經常收到如果沒有數據可用但將阻止,這就是你提供這兩個while語句之間的差別 - 第一個爆發在很短的讀取,這可能表明你的下一個讀將阻塞,而第二個查找流結束,即從另一側關閉插座。