【问题标题】:NetworkStream gets System.IO.IOException: Unable to write data to the transport connectionNetworkStream 获取 System.IO.IOException:无法将数据写入传输连接
【发布时间】:2018-04-03 00:09:08
【问题描述】:

我正在使用 NetworkStream 来保持可以发送消息的开放 TCP/IP 连接。我收到一条消息,处理它,然后返回一个 ACK​​。我正在使用一个偶尔会收到消息的站点,但是当我发送 ACK 时,我得到一个 IOException。有时这只会持续一两条消息(我可以收到下一条消息),而其他时候它会一直持续到服务停止并重新启动。

下面是我的 NetworkStream 的代码,没有任何处理:

using (NetworkStream stream = client.GetStream())
{
   stream.ReadTimeout = ReadTimeout;
...
   if (stream.CanRead && stream.DataAvailable)
   bytesRead = stream.Read(receivedBytes, 0, BufferSize);
...
   stream.Write(ack, 0, ack.Length);
}

请注意,代码在读取新消息和发送 ACK 之间循环。

当我调用stream.Write时,有时会出现以下异常:

System.IO.IOException: Unable to write data to the transport connection: An established connection was aborted by the software in your host machine. ---> System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at Framework.Communication.Model.Server.AcceptMessage(IAsyncResult ar)

我查看了这条消息并找到了几个sources 用于几种不同的通信方法。听起来这是一个非常通用的异常,并不能真正说明发生了什么。

有谁知道会导致这种情况的原因,或者我可以从哪里开始寻找缩小解决方案的范围?

【问题讨论】:

    标签: c# tcp ioexception networkstream


    【解决方案1】:

    您认为这是一个普遍的问题是正确的,因此您必须更加防御。

    需要考虑的事项

    1. 当应用程序以正确的方式关闭套接字时,它会发送一条包含 0 字节的消息。
    2. 在某些情况下,您可能会收到一个SocketException,表示出现问题。
    3. 在第三种情况下,远程方不再连接(例如通过拔下网络电缆),双方之间没有任何通信。

      • 如果发生这种情况,您必须将数据写入套接字以检测您无法再访问远程方。这就是为什么发明了保持活动机制的原因——它们会不时检查是否仍然可以与对方通信。

    注意:这些都不能解释部分内容的间歇性 问题(如果我没看错的话)


    让我们看看文档是怎么说的

    NetworkStream.Write Method (Byte[], Int32, Int32)

    IOException

    • 写入网络时出现故障。
    • 访问套接字时出错。有关详细信息,请参阅备注部分。

    备注

    如果您收到SocketException,请使用 SocketException.ErrorCode属性获取具体错误 代码,参考 Windows Sockets 版本 2 API 错误代码 MSDN 中的文档以获取错误的详细说明


    所以在我看来,正如前面提到的,你需要更加防御。

    1. 检查 0 个字节。

    2. 检查错误。

      • 如果您遇到错误,请确保您正在检查错误代码

    在这两种情况下,再次重新启动连接、记录故障并假设连接已关闭(或异常关闭)可能是一种很好的做法(并且有意义)


    其他资源

    Detect closed network connection

    **** Detection of Half-Open (Dropped) Connections **** 斯蒂芬·克利里

    【讨论】:

    • 谢谢。这是一个很好的解释,并为我提供了资源,使我能够继续解决这个问题。正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2011-08-13
    • 2012-02-17
    • 1970-01-01
    • 2019-08-19
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多