PHP套接字超时不会低于0.5秒

时间:2015-06-25 13:28:01

标签: php sockets

我正在尝试扫描ip范围并从特定设备获取信息。 问题是,虽然我有SO_RCVTIMEOarray('sec'=>0,'usec'=>1000) 应该超时的每个请求都在0.5 seconds左右。另一方面,其他人只需0.005 seconds。你可以想象,如果我想扫描一个大的IP范围,那我就注定了。

我做错了什么或我该如何改进?

以下是代码

foreach($ipArray as $ip){
    $result = array();
    $buf = '';
    $from = '';
    $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    socket_set_option($sock,SOL_SOCKET,SO_RCVTIMEO,$timeout);
    socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
    //socket_bind($sock, $from, 2048);
    socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 0);
    socket_sendto($sock, $data1, strlen($data1), 0, $ip, 10001);
    $time = microtime(true);
    if(!socket_recvfrom($sock, $buf, 512000, 0, $from, $port)){
        echo (microtime(true) - $time) . ' elapsed<br><br><br>';
        continue;
    }
    echo (microtime(true) - $time) . ' elapsed<br><br><br>';
    $result= parse_result(bin2hex($buf));
    socket_close($sock);
}

请注意,我正在为每个IP创建一个单独的套接字,因为出于某种原因否则结果会在ips之间混淆,我有时会得到相同的结果两次。

在Windows Bitnami计算机上运行。

由于

1 个答案:

答案 0 :(得分:0)

结果证明,Windows可以设置的最小超时量远远高于linux。

基本上array('sec'=>0,'usec'=>1000) usec部分只适用于Linux机器。