2012-03-21 124 views
2

我正在使用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爲假,然後我連續讀停止,從不讀取任何數據,這並不正常工作。

什麼是正確的異步方法來繼續讀取數據,直到另一端關閉套接字或我選擇關閉套接字?

回答

0

而不是檢查bytesRead或DataAvailable屬性來檢查套接字是否關閉,將調用包裝到BeginRead並捕獲IOException。然後應該告訴你套接字是否關閉。

+0

謝謝 - 那麼正確的循環是什麼?繼續調用BeginRead()並讓EndRead()一遍又一遍地返回0字節? – SofaKng 2012-03-21 15:24:56

+2

我剛剛通過telneting進入我的監聽套接字來測試這個,並且由於某種原因,甚至在斷開我的telnet客戶端之後也不會拋出異常...... – SofaKng 2012-03-21 16:01:53

相關問題