【问题标题】:When to use TcpClient.ReceiveTimeout vs. NetworkStream.ReadTimeout?何时使用 TcpClient.ReceiveTimeout 与 NetworkStream.ReadTimeout?
【发布时间】:2015-08-04 02:53:19
【问题描述】:

在编写 TCP 服务器时,我想设置从客户端读取请求的超时时间:

var tcpClient = tcpListener.AcceptTcpClient();
var networkStream = tcpListener.GetStream();

tcpClient.ReceiveTimeout = 10000;
networkStream.ReadTimeout = 10000;

查看最后两行。我应该更喜欢哪一个?它们在有效性方面是否相同,或者它们在哪些方面不同?

【问题讨论】:

    标签: c# tcp stream timeout tcpclient


    【解决方案1】:

    我应该更喜欢哪一个?

    前者和后者都会将其内部Socket 设置为接收超时。同一个套接字将从TcpClient 冒泡到创建的NetworkStream,所以我会选择前者

    它们在有效性方面是否相同或在哪些方面不同?

    我们可以看看source code,这是一件好事。 这是TcpClient.ReceiveTimeout

    public int ReceiveTimeout 
    {
        get 
        {
            return numericOption(SocketOptionLevel.Socket,
                                 SocketOptionName.ReceiveTimeout);
        }
        set 
        {
            Client.SetSocketOption(SocketOptionLevel.Socket,
                              SocketOptionName.ReceiveTimeout, value);
        }
    }
    

    设置底层客户端套接字的接收超时(Client 的类型为Socket)。然后传递给NetworkStream

    public NetworkStream GetStream() 
    {
        // Shortened for brevity
        if (m_DataStream==null)
        {
            m_DataStream = new NetworkStream(Client, true);
        }
        return m_DataStream;
    }
    

    NetworkStream 查找超时时,它会在Socket 内部查找:

    public override int ReadTimeout 
    { 
        get 
        {
            int timeout = (int)m_StreamSocket.GetSocketOption(SocketOptionLevel.Socket,
                                                              SocketOptionName.ReceiveTimeout);
            if (timeout == 0) 
            {
                return -1;
            }
        }
        return timeout;
    }
    

    【讨论】:

    • 这是有道理的。谢谢你的回答。
    猜你喜欢
    • 2015-06-29
    • 2018-07-20
    • 2014-05-21
    • 2020-04-30
    • 2019-02-02
    • 2021-12-24
    • 2011-05-28
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多