Php 套接字\u连接未超时
我正在使用套接字向可能没有响应的服务器发送数据。因此,我试图通过在So中使用此解决方案来定义超时 当建立了连接并且服务器需要很长时间才能响应时,这种方法会起作用。 但是当它无法创建连接时,Php 套接字\u连接未超时,php,sockets,timeout,Php,Sockets,Timeout,我正在使用套接字向可能没有响应的服务器发送数据。因此,我试图通过在So中使用此解决方案来定义超时 当建立了连接并且服务器需要很长时间才能响应时,这种方法会起作用。 但是当它无法创建连接时,socket\u connect($socket,$addr,$port)超时时间约为20秒 为什么会发生20秒的超时?我如何强制连接创建也在1秒后超时?您可以切换到非阻塞套接字,循环直到获得连接或达到超时,然后再次返回阻塞 // an unreachable address $host = '10.0.0.
socket\u connect($socket,$addr,$port)代码>超时时间约为20秒
为什么会发生20秒的超时?我如何强制连接创建也在1秒后超时?您可以切换到非阻塞套接字,循环直到获得连接或达到超时,然后再次返回阻塞
// an unreachable address
$host = '10.0.0.1';
$port = 50000;
$timeout = 2;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// switch to non-blocking
socket_set_nonblock($sock);
// store the current time
$time = time();
// loop until a connection is gained or timeout reached
while (!@socket_connect($sock, $host, $port)) {
$err = socket_last_error($sock);
// success!
if($err === 56) {
print('connected ok');
break;
}
// if timeout reaches then call exit();
if ((time() - $time) >= $timeout) {
socket_close($sock);
print('timeout reached!');
exit();
}
// sleep for a bit
usleep(250000);
}
// re-block the socket if needed
socket_set_block($sock);
编辑:如果您使用的是使用fsockopen()或stream\u socket\u client()创建的套接字,请参阅@letiagalves answer以获得更简洁的解决方案。我将套接字通信机制改为使用stream\u socket\u client($remote\u socket,&$errno,&$errstr,$timeout)
函数。此函数允许定义连接超时,而不像socket\u connect($socket,$address,$port)
那样
要使用socket\u connect
强制超时,请参阅@bigtallbill answer。在某些平台上,SO\u RCVTIMEO/SO\u sndttimeo选项不适用于socket\u connect,而仅适用于socket\u recv/socket\u send。我可以看到它在Ubuntu上工作,但在Mac OSX上不起作用。我尝试了很多带套接字的变体
最适合简单操作,例如测试连接usec是微秒。为什么将其设置为0?@RobertPodwika,因为我希望它精确为1秒,0微秒+1,谢谢。我使用了不同的机制。这很容易改变。请看我的答案,这肯定是很重要的:P确实返回了一个文件资源而不是一个socket RockCE,所以用例是绝对需要考虑的。我对socket的内部结构不够流利,不能说使用这两种方法是否更好。
// an unreachable address
$host = '10.0.0.1';
$port = 50000;
$timeout = 2;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// switch to non-blocking
socket_set_nonblock($sock);
// store the current time
$time = time();
// loop until a connection is gained or timeout reached
while (!@socket_connect($sock, $host, $port)) {
$err = socket_last_error($sock);
// success!
if($err === 56) {
print('connected ok');
break;
}
// if timeout reaches then call exit();
if ((time() - $time) >= $timeout) {
socket_close($sock);
print('timeout reached!');
exit();
}
// sleep for a bit
usleep(250000);
}
// re-block the socket if needed
socket_set_block($sock);