2015-06-25 1 views
0

Я пытаюсь отсканировать 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.

Благодаря

ответ

0

Оказывается, Windows, имеет минимальное количество времени ожидания вы можете установить путь, который выше, чем на Linux.

В основном, array('sec'=>0,'usec'=>1000) часть его usec работает только на машинах Linux.

Смежные вопросы