我正在尝试扫描ip范围并从特定设备获取信息。问题是,尽管我有SO_RCVTIMEO
到array('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机器中工作。