我正在使用NetworkStream.BeginRead / EndRead从套接字进行异步读取。
但是,NetworkStream.EndRead()有时返回0(即从套接字读取0个字节)我认为套接字已关闭,但这不是真的,因为如果我一直调用BeginRead(),我最终会收到更多数据。
这不是从socket / 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属性来确定套接字上是否有更多数据可用,但即使更多数据可能会在以后到达,这也是假的。
例如,根据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变为FALSE然后我的连续读取停止并且从不再读取任何数据。
在另一端关闭套接字或我选择关闭套接字之前,继续读取数据的正确异步方法是什么?
答案 0 :(得分:0)
不是检查bytesRead或DataAvailable属性来检查套接字是否已关闭,而是将调用包装到BeginRead并捕获IOException。那应该告诉你套接字是否关闭。