我正在尝试扫描ip范围并从特定设备获取信息。
问题是,虽然我有SO_RCVTIMEO
到array('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计算机上运行。
由于
答案 0 :(得分:0)
结果证明,Windows可以设置的最小超时量远远高于linux。
基本上array('sec'=>0,'usec'=>1000)
usec部分只适用于Linux机器。