Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 套接字\u连接未超时_Php_Sockets_Timeout - Fatal编程技术网

Php 套接字\u连接未超时

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.

我正在使用套接字向可能没有响应的服务器发送数据。因此,我试图通过在So中使用此解决方案来定义超时

当建立了连接并且服务器需要很长时间才能响应时,这种方法会起作用。 但是当它无法创建连接时,
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);