【问题标题】:Socket ReceiveTimeout套接字接收超时
【发布时间】:2012-03-08 19:09:30
【问题描述】:

我已将ReceiveTimout 指定为 40 毫秒。但是接收超时需要超过 500 毫秒。我正在使用秒表来计算所用时间。

代码如下所示。

Socket TCPSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
                              ProtocolType.Tcp);
TCPSocket.ReceiveTimeout = 40;

try
{  
    TCPSocket.Receive(Buffer);  

}  catch(SocketException e)  {  }

【问题讨论】:

  • 请提供更多代码。

标签: c# sockets timeout


【解决方案1】:

您不能使用小于 500 毫秒的超时值。 在这里查看SendTimeouthttp://msdn.microsoft.com/en-us/library/system.net.sockets.socket.sendtimeout

尽管 MSDN 没有对 ReceiveTimeout 规定相同的要求,但我的经验表明这个限制仍然存在。

您还可以在几篇 SO 帖子中阅读有关此内容的更多信息:

【讨论】:

    【解决方案2】:

    您可以使用任何您希望的超时时间同步轮询套接字。如果Poll() 返回true,您可以确定您可以拨打Receive() 不会阻塞。

    Socket s;
    // ...
    // Poll the socket for reception with a 10 ms timeout.
    if (s.Poll(10000, SelectMode.SelectRead))
    {
        s.Receive(); // This call will not block
    }
    else
    {
        // Timed out
    }
    

    我建议您阅读 Stevens 的 UNIX 网络编程第 6 章和第 16 章,以获取有关非阻塞套接字使用的更深入信息。尽管本书的名称中有 UNIX,但 UNIX 和 Windows(以及 .net)中的整体套接字架构本质上是相同的

    【讨论】:

      【解决方案3】:

      我找到了这个:

      Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      
      IAsyncResult result = socket.BeginConnect( sIP, iPort, null, null ); 
      
      bool success = result.AsyncWaitHandle.WaitOne( 40, true ); 
      
      if ( !success ) 
      {           
      
                  socket.Close(); 
                  throw new ApplicationException("Failed to connect server."); 
      } 
      

      【讨论】:

      • 我要求接收是同步的而不是异步的。如果接收超时,我也不希望套接字关闭。
      猜你喜欢
      • 2012-04-20
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 2014-06-05
      相关资源
      最近更新 更多