NetworkStream获取System.IO.IOException:无法将数据写入传输连接

时间:2018-04-03 00:09:09

标签: c# tcp ioexception networkstream

我正在使用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。听起来这是一个非常普遍的例外,并不能真正说明发生了什么。

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

1 个答案:

答案 0 :(得分:6)

你认为这是一个普遍的问题是正确的,所以你必须更加防守。

要考虑的事项

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

    • 如果发生这种情况,您必须将数据写入套接字,以便检测到您无法再访问远程方。这就是发明保持活动机制的原因 - 它们经常检查它们是否仍能与另一方通信。
  4.   

    注意:这些都没有解释部分内容的间歇性   问题(如果我正确阅读)

    让我们看一下文档说的内容

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

      

    IOException

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

    <强>说明

         

    如果您收到SocketException,请使用。{   SocketException.ErrorCode属性获取特定错误   代码,引用Windows Sockets版本2 API错误代码   有关错误的详细说明,请参阅MSDN中的文档。

    所以在我看来,如前所述,你需要更加防守。

    1. 检查0个字节。

    2. 检查错误。

      • 我收到错误,请确保您正在检查错误代码
    3. 在这些情况中的任何一种情况下,重新启动连接,记录失败并假设连接已关闭(或异常关闭)可能是良好的做法(并且有意义)

      其他资源

      Detect closed network connection

      **** Detection of Half-Open (Dropped) Connections **** Stephen Cleary