PHP套接字超时获胜';t低于0.5秒


PHP Socket timeout won't go below 0.5 seconds

我正在尝试扫描ip范围并从特定设备获取信息。问题是,尽管我有SO_RCVTIMEOarray('sec'=>0,'usec'=>1000)每个应该超时的请求都在CCD_ 3附近。另一方面,其他人只服用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创建了一个单独的套接字,因为出于某种原因,否则结果会在IP之间混淆,有时我会得到两次相同的结果。

在Windows Bitnami计算机上运行此程序。

感谢

事实证明,Windows有一个可以设置的最小超时量,远高于linux。

基本上,它的array('sec'=>0,'usec'=>1000) usec部分只在Linux机器中工作。