我正在使用NetworkStream.BeginRead/EndRead從套接字進行異步讀取。但是,NetworkStream.EndRead()有時會返回0(即從套接字讀取的0字節),我認爲這表示套接字已關閉,但這不是事實,因爲如果我最終調用BeginRead(),我會接收更多數據。即使在NetworkStream.EndRead返回0字節後,爲什麼仍然會接收數據?
這是不是一個適當的循環來連續從套接字/ NetworkStream讀取數據?
void BeginContinousRead()
{
// Start the continous async read
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
private void ProcessNetworkStreamRead(IAsyncResult result)
{
// This will sometimes be zero?!
int bytesRead = mStream.EndRead(result);
// Continue reading more data and call this callback method again over and over, etc.
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
根據MSDN,我應該使用NetworkStream.DataAvailable屬性,以確定是否更多的數據是可用的插座上,但是這將是FALSE,即使更多的數據可能會在晚些時候到達。
例如,根據MSDN這應該是我的回調:
private void ProcessNetworkStreamRead(IAsyncResult result)
{
// This will sometimes be zero?!
int bytesRead = mStream.EndRead(result);
while (mStream.DataAvailable)
mStream.BeginRead(mDataBuffer, 0, mDataBuffer.Length, new AsyncCallback(ProcessNetworkStreamRead), null);
}
...但因爲DataAvailable爲假,然後我連續讀停止,從不讀取任何數據,這並不正常工作。
什麼是正確的異步方法來繼續讀取數據,直到另一端關閉套接字或我選擇關閉套接字?
謝謝 - 那麼正確的循環是什麼?繼續調用BeginRead()並讓EndRead()一遍又一遍地返回0字節? – SofaKng 2012-03-21 15:24:56
我剛剛通過telneting進入我的監聽套接字來測試這個,並且由於某種原因,甚至在斷開我的telnet客戶端之後也不會拋出異常...... – SofaKng 2012-03-21 16:01:53