由于超时导致异常后我可以继续使用NetworkStream吗?

时间:2017-06-01 12:44:38

标签: c# sockets tcp exception-handling tcpclient

NetworkStream接收数据时,我可以配置stream.ReadTimeout 如果在配置的时间内未收到任何数据,我会获得SocketException ex.SocketErrorCode=SocketError.TimedOut

我可以在此异常后继续使用流,还是有可能以某种方式丢失某些字节?

示例代码:

using (TcpClient client = new TcpClient("127.0.0.1", 2000))
using (NetworkStream stream = client.GetStream())
using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
{
    stream.ReadTimeout = 5000;

    while (true)
    {
        int i;
        try
        {
            i = reader.Read();
        }
        catch (IOException ex)
        {
            SocketError socketError = SocketError.Success;
            if (ex.InnerException is SocketException)
                socketError = ((SocketException)ex.InnerException).SocketErrorCode;

            if (socketError == SocketError.TimedOut)
            {
                Console.WriteLine("no data received for 5 seconds");
                continue;
            }
            else throw;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我没有在.NET端找到任何这方面的文档,但是NetworkStream.ReadTimeout使用(在Windows上)setsockopt本机函数,并且在这个函数的描述中,它的各种选项都清楚地说明了(在SO_RCVTIMEOSO_SNDTIMEO错误代码的说明中):

  

如果发送或接收操作在套接字上超时,则为套接字状态   是不确定的,不应该使用;处于此状态的TCP套接字   由于可以取消操作,因此可能会丢失数据   在同一时刻,该行动将完成。