gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:38:39 26 4
gpt4 key购买 nike

我正在使用 NetworkStream.BeginRead/EndRead 从套接字进行异步读取。

但是,NetworkStream.EndRead() 有时会返回 0(即从套接字读取了 0 个字节),我认为这表明套接字已关闭,但事实并非如此,因为如果我继续调用 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 这应该是我的回调:

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,然后我的连续读取停止并且不再读取任何数据。

在另一端关闭套接字或我选择关闭套接字之前继续读取数据的正确异步方法是什么?

最佳答案

不是检查 bytesRead 或 DataAvailable 属性来检查套接字是否关闭,而是包装对 BeginRead 的调用并捕获 IOException。然后应该会告诉您套接字是否已关闭。

关于.net - 为什么即使在 NetworkStream.EndRead 返回 0 字节后我仍然接收数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9806494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com