Не проходит функция fsockopen

Тема в разделе "PHP", создана пользователем joni, 17 май 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. joni

    joni Писатель

    Регистр.:
    29 июн 2007
    Сообщения:
    9
    Симпатии:
    1
    Пользуюсь вот такой конструкцией для пинга (суть не в нем)

    PHP:
    <?php  
    $host 
    '172.16.2.29' ;  
    $timeout ;  

        
    //Open the socket  
    $handle = @fsockopen("udp://$host"2701$errno$errstr1);
    if (! 
    $handle )  
    echo 
    "$errstr ($errno)<br>\r\n" ;  
    else {  
        
    //Set read timeout  
    stream_set_timeout $handle $timeout );  
    for ( 
    $i $i $i ++){  
        
    //Time the responce  
    list ( $usec $sec ) = explode " " microtime true ));  
    $start =(float) $usec + (float) $sec ;  

        
    //send somthing  
    $write fwrite $handle " echo this\n" );  
    if (! 
    $write ){  
    echo 
    "Error in writing to socked<br>\r\n" ;  
    break;  
    }  
    echo 
    'Send packet to ' $host ;  

        
    //Try to read. the server will most likely respond with a "ICMP Destination Unreachable" and end the read. But that is a responce!  
    fread $handle 1024 );  

        
    //Work out if we got a responce and time it  
    list ( $usec $sec ) = explode " " microtime true ));  
    $laptime =((float) $usec + (float) $sec )- $start ;  
    if ( 
    $laptime $timeout )  
    echo 
    " : No reply<br>\r\n" ;  
    else  
    echo 
    " : Round trip = " round $laptime ). " s<br>\r\n" ;  
    }  
    fclose $handle );  
    }  
    ?>
    Если ставить любой не использующийся порт на удаленной машине - все "пингует" и ошибок нет.
    Если ставлю Порт на котором висит какая то либо игра (CS например) то "пинг" не доходит.
    Та же беда в принципе и в мониторингах для игровых серверов. Беда только на одной WEB машине (веб сервер).
    машина стоит за nginx на самой машине апач и php4.
    Подскажите в какую сторону копать, чтобы исправить?
     
  2. General Fizz

    General Fizz Боевой Генерал :)

    Регистр.:
    11 апр 2007
    Сообщения:
    753
    Симпатии:
    396
    Для начала поднять все логи (access.log, error.log, system.log, значения $errno, $errstr, etc) и посмотреть сообщения.

    Еще возможно на машине фаерволом закрыты нужные порты или udp.
     
  3. joni

    joni Писатель

    Регистр.:
    29 июн 2007
    Сообщения:
    9
    Симпатии:
    1
    nmap обрабатывает данные запросы на udp порты. файерволов нет.
    по логам вроде пусто.
     
  4. Simpson

    Simpson

    Регистр.:
    22 июл 2007
    Сообщения:
    373
    Симпатии:
    36
    Что-то не понятно как "пинг" должен "доходить" на открытый порт? То что мне видно, это что серверу игры посылается строка "echo this" и ждется ответ. Если ответа нет, то - ошибка. Я, конечно, не специалист по серверным играм, но может быть CS и не должна ничего отвечать на такие запросы??
     
  5. cobain

    cobain Создатель

    Регистр.:
    12 май 2008
    Сообщения:
    18
    Симпатии:
    2
    Если ты хочешь фукцию пинга хоста то используй только порт для ICMP пакетов, как указал автор скрипта
    $handle=fsockopen('udp://'.$host, 7, $errno, $errstr, $timeout);

    Если же ты хочешь проверить работоспособность некого сервиса на удалённом хосте, то либо просто проверяй можно ли просто открыть нужный порт на удалённом хосте. Либо если хочешь получить ответ от этого серсиса, то знай что ему послать (для CS, можно сниффером примеры запросов отлавить, когда в игре обновляешь список серверов в сети).
     
  6. joni

    joni Писатель

    Регистр.:
    29 июн 2007
    Сообщения:
    9
    Симпатии:
    1
    ок. спасибо что разъяснил. встречный вопрос, как проверить открыт ли порт?

    Вопрос закрыт. проблему решил
    Мой ТО капал мне на мозг, что там небыло файервола. а он был.
     
Статус темы:
Закрыта.