为什么即使在NetworkStream.EndRead返回0字节后,我仍然在接收数据?

我使用NetworkStream.BeginRead / EndRead从套接字进行asynchronous读取。

然而,NetworkStream.EndRead()有时返回0(即从套接字读取0字节),我认为表示套接字已closures,但这是不正确的,因为如果我一直调用BeginRead(),最终我会收到更多的数据。

这是不是一个适当的循环来连续读取套接字/ 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,这应该是我的callback:

 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成为FALSE,然后我不断的读取停止,并永远不会读取更多的数据。

什么是正确的asynchronous方法来继续读取数据,直到另一端closures套接字或我selectclosures套接字?

而不是检查bytesRead或DataAvailable属性来检查套接字是否关闭,将调用包装到BeginRead并捕获IOException。 这应该告诉你,如果套接字关闭。