如何控制C#Socket的连接超时时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何控制C#Socket的连接超时时间相关的知识,希望对你有一定的参考价值。

参考技术A 1.使用BeginConnect方法
IAsyncResult
connResult
=
mySocket.BeginConnect(yourAddress,
yourPort,
null,
null);
connResult.AsyncWaitHandle.WaitOne(2000,
true);
//等待2秒
if
(!connResult.IsCompleted)

  mySocket.Close();
  //处理连接不成功的动作

else

  //处理连接成功的动作

这种方法很好的控制了连接超时时间而且代码非常简单,但是界面仍然会有2秒的卡死产生。如果想解决该问题,则需要创建一个额外的线程来执行WaitOne方法。
2.使用ConnectAsync方法
SocketAsyncEventArgs
e
=
new
SocketAsyncEventArgs();
e.Completed
+=
new
EventHandler<SocketAsyncEventArgs>(AsyncConnected);
e.RemoteEndPoint
=
new
IPEndPoint(IPAddress.Parse(yourAddress),
yourPort);

在 socket_read 上设置超时

【中文标题】在 socket_read 上设置超时【英文标题】:Set a timeout on socket_read 【发布时间】:2010-09-28 05:26:37 【问题描述】:

我想知道如何设置socket_read 呼叫的超时时间?第一次调用socket_read,它会等到发送数据,如果5秒内没有发送数据,我想关闭连接。有什么帮助吗?我已经尝试过SO_RCVTIMEO,但没有成功。

我正在使用socket_create() 创建一个套接字并在其上侦听连接,然后在连接时侦听数据,然后对其进行处理。超时时,我想运行socket_shutdown(),然后运行socket_close()

【问题讨论】:

请注意,Windows Sockets API 不适用于小于 500 毫秒的超时。您可以将超时设置为更短的时间,但是当您使用 Windows 平台时,您应该知道这可能不会像您想要的那样工作。参考:microsoft.com/mspress/books/WW/sampchap/4287d.aspx. 【参考方案1】:

这设置了套接字的 5 秒超时。

socket_set_option($socket,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));

【讨论】:

经过一些测试 - 这似乎是整个套接字的生命周期 - 不仅仅是 socket_read 有趣的观察:如果你使用 PHP_NORMAL_READ 而不是 PHP_BINARY_READ(默认)作为 socket_read() 的第三个参数,它将忽略使用 socket_set_option() 设置的超时,并且会无限期地阻塞,直到发送一些东西。 .(使用 PHP 5.5.9 观察) 另一个有趣的观察:如果从数组中删除`usec`,它就不起作用 工作不可靠,你不能相信它。即使配置了几毫秒的超时,我也有很多情况下它会挂起几分钟。可能取决于 TCP 标志 在使用socket_create() 创建的主$socket 上设置此项将影响socket_accept() 超时和socket_read() 超时。要仅影响 socket_read() 超时,请将其设置在使用 $socket_name = socket_accept() 创建的第二个套接字名称上。【参考方案2】:

你试过socket_set_option和SO_RCVTIMEO

输入操作的超时值。

【讨论】:

我试过了!我想我找到了一个使用 socket_listen 的解决方案,并使用 time()+2 和一段时间手动超时。 太棒了!这为我解决了它。我现在有一个 socket_read() 对我来说超时。【参考方案3】:

我做了一个 socket_listen,然后我用 time()+2 和一个带有非块集和 socket_read() 的 while 循环手动超时。似乎工作正常。有其他选择吗?

更新:我发现将套接字设置为非阻塞,然后使用 socket_listen 提供了我需要的超时。

【讨论】:

哦,您正在接受与 PHP 的套接字连接。这有点不同。 us3.php.net/manual/en/function.socket-select.php 如果有任何内容可供读取,Select 将返回套接字,否则会在您指定的超时时间内超时。【参考方案4】:
$read_socket = socket_select($read, $write  = NULL, $except = NULL, 10); // 10 - Timeout
if($read_socket === FALSE)
    $this->End();
elseif($read_socket === 0)
    return FALSE;

$pdu_ = socket_read($this->session, 102400);
if($read_socket && !strlen($pdu_))
    $this->End();

【讨论】:

解释一下会很有帮助。

以上是关于如何控制C#Socket的连接超时时间的主要内容,如果未能解决你的问题,请参考以下文章

MySQL连接超时自动断开连接应该怎样处理

如何设定ClientSocket的超时时间。

C: 套接字连接超时

在 socket.io 中控制来自客户端的心跳超时

非活动客户端连接的socket.io服务器端超时?

C# socket超时释放端口