如何控制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的连接超时时间的主要内容,如果未能解决你的问题,请参考以下文章