初學者問題再次提問:不久前提問的問題。Socket.Receive何時返回數據?
我想了解這個同步套接字教程http://msdn.microsoft.com/en-us/library/6y0e13d3.aspx,特別是下面代碼中的一行。
問題: 我想確保我瞭解程序流程的正確性。 當沒有handler.Receive(bytes)返回?它是否返回並存儲在int bytesRec **中收到的字節數,當它「溢出」且已收到超過1024字節? **如果是這樣的,這可能聽起來很愚蠢,如果更多的字節到達,會發生什麼情況,因爲它將1024字節存儲在* 數據 *變量中,並且不會偵聽當時可能到達的更多字節?或者我不應該擔心它,讓.net處理這個問題?
Socket handler = listener.Accept();
data = null;
// An incoming connection needs to be processed.
while (true) {
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
// My question is WHEN does the following line
// get to be executed
data += Encoding.ASCII.GetString(bytes,0,bytesRec);
if (data.IndexOf("<EOF>") > -1) {
break;
}
}
您可以認爲接收很像從文件讀取。如果文件中仍有足夠的數據字節(在本例中爲網絡堆棧),它將返回到您的緩衝區大小,否則它將返回其餘數據(可能小於緩衝區大小) 。 – shellster 2013-03-20 13:02:09
@shellster:那種。但是這個描述掩蓋了一個非常重要的事實,即網絡堆棧可能會決定將數據交給它*選擇的任何塊。沒有保證。 – Jon 2013-03-20 13:04:31
@Jon謝謝你的出色答案。當你說「網絡堆棧可能決定將數據以你選擇的任何塊傳遞給你」是否意味着我的客戶端可能會發送「抱歉親愛的,我不是單身但已婚」但我的服務器可能會收到「但已婚」之前「對不起親愛的」?上面的微軟代碼沒有這樣的錯誤檢查... wouldnt tcp/ip照顧,所以我收到正確的順序數據 – 2013-03-20 13:16:00