За последние 24 часа нас посетили 17629 программистов и 1725 роботов. Сейчас ищут 899 программистов ...

Неблокирующие сокеты. Сканирование по большому числу ip

Тема в разделе "Прочие вопросы по PHP", создана пользователем Feofan, 26 ноя 2007.

  1. Feofan

    Feofan Активный пользователь

    С нами с:
    26 ноя 2007
    Сообщения:
    4
    Симпатии:
    0
    Написал скрипт для сканирования 5 хостов по определенному порту, но не знаю как его переделать для большого числа ip. Хотя кажется, что и этот вариант не очень правильный.
    Сам скрипт:
    PHP:
    1.  
    2. // $hosts - массив с проверяемыми ip
    3. foreach ($hosts as $i => $host) {
    4.    
    5.     $sockets[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    6.     socket_set_nonblock($sockets[$i]);
    7.     @socket_connect($sockets[$i], $host, $port);
    8. }
    9.  
    10. foreach ($sockets as $i => $socket) {
    11.  
    12.     $arrRead[] = $socket; // массив сокетов для чтения
    13. }
    14.  
    15. $arrWrite = NULL;
    16.  
    17. $num = socket_select($arrRead, $arrWrite, $arrExcept = NULL, 2);
    18. if ($num > 0) {
    19.  
    20.     if (count($arrRead) > 0) {
    21.  
    22.         foreach($arrRead as $i => $socket) {
    23.  
    24.             $do = true;
    25.             while ($do == true) {
    26.  
    27.                 $str = socket_read($socket, 1024);
    28.                 echo "$str<br>";
    29.                 flush();
    30.  
    31.                 if ($str == "") {
    32.  
    33.                     $do = false;
    34.                     socket_shutdown($socket);
    35.                     socket_close($socket);
    36.                 }
    37.             }
    38.         }
    39.     }
    40. }
    41.  
     
  2. Feofan

    Feofan Активный пользователь

    С нами с:
    26 ноя 2007
    Сообщения:
    4
    Симпатии:
    0
    Может кто знает почему не "убивается" сокет, созданный с помощью функции fsockopen(), socket_create?
     
  3. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    давненько искал ответ. тогда, решением было перезагрузка скрипта после n соединений
    было это дело под M$, мб *nix нет этой проблемы (а если и есть можно форкать процес и там сокет юзать - мертвый процесс мертвый сокет)
     
  4. Feofan

    Feofan Активный пользователь

    С нами с:
    26 ноя 2007
    Сообщения:
    4
    Симпатии:
    0
    Что вы имеете в виду под перезагрузкой? Редирект страницы с помощью javascript на саму себя?
     
  5. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    да как угодно
     
  6. Feofan

    Feofan Активный пользователь

    С нами с:
    26 ноя 2007
    Сообщения:
    4
    Симпатии:
    0
    Нифига не помогает. Есть у кого еще мысли как принудительно закрыть сокет?