使用相同的NetworkStream进行读写时的IOException

时间:2018-03-04 02:07:59

标签: c# sockets

我从以下代码

获得IOExection
public async Task Register(string handle)
{
    // send register handle
    using (NetworkStream stream = client.GetStream())
    {
        await RegisterHandle(stream);
        var line = "hello world";
        await SendMessage(stream, line);
    }
}

public async Task SendMessage(NetworkStream stream, string message)
{
    Console.WriteLine("SendMessage(" + message + ")");
    await Async.Write(stream, message);
    Console.WriteLine("End of SendMessage");
}

System.AggregateException: One or more errors occurred. (Unable to transfer    data on the transport connection: An established connection was aborted by the software in your host machine.) ---> System.IO.IOException: Unable to transfer data on 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

我该怎么做才能解决这个问题?

RegisterHandle只是写入数据然后回读;哪个工作正常。但是在SendMessage中写入时失败了。

1 个答案:

答案 0 :(得分:0)

它实际上都在docuemtnation中详细解释了

您需要尝试检查异常消息,如果您可以控制连接套接字,则可以解决它关闭的问题。如果以上都不是您可能遇到网络问题,但我会先进行Occam's razor分析

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

  

IOException 写入网络时出现故障。

     

-OR -

     

访问套接字时发生错误。请参阅备注部分   了解更多信息。

<强>说明

  

Write方法从指定的偏移量开始并发送大小字节   从缓冲区的内容到网络。 Write方法阻塞   直到发送请求的字节数或SocketException为止   抛出。如果收到SocketException,请使用   SocketException.ErrorCode属性获取特定的错误代码,   并参考Windows套接字版本2 API错误代码   MSDN中的文档,以获取错误的详细说明。

注意

  

通过访问来检查NetworkStream是否可写   CanWrite属性。如果您尝试写入NetworkStream   不可写,你会得到一个IOException。如果你收到了   IOException,检查InnerException属性以确定它是否是   由SocketException引起。