何时使用TcpClient.ReceiveTimeout与NetworkStream.ReadTimeout?

Dio*_*o F 10 c# timeout tcp stream tcpclient

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

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

tcpClient.ReceiveTimeout = 10000;
networkStream.ReadTimeout = 10000;
Run Code Online (Sandbox Code Playgroud)

见最后两行.我应该选择哪一个?它们在有效性方面是否相同,或者它们在哪些方面有所不同?

Yuv*_*kov 9

我应该选择哪一个?

前者和后者都将其内部Socket设置为接收超时.从相同的插座会起泡TcpClientNetworkStream创造,所以我一起去前者.

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

我们可以查看源代码是件好事.这是TcpClient.ReceiveTimeout:

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

这设置了underling客户端套接字的接收超时(Client属于类型Socket).然后传递到NetworkStream:

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

NetworkStream查找超时时,它看起来在Socket:

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