Я пытаюсь отсканировать ip-диапазон и получить информацию с определенных устройств. Проблема в том, что у меня есть SO_RCVTIMEO
до array('sec'=>0,'usec'=>1000)
каждый запрос, который должен превышать 0.5 seconds
. Другие, с другой стороны, принимают только 0.005 seconds
. Вы можете себе представить, что если я хочу сканировать большой диапазон IP-адресов, то я обречен.PHP Тайм-аут сокета не будет ниже 0,5 секунды
Что я делаю неправильно или как я могу улучшить его?
Ниже приведен код
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, потому что по какой-то причине, в противном случае результаты будут запутаться между ИПС и я иногда получить тот же результат в два раза.
Выполнение этого на компьютере Windows Bitnami.
Благодаря