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

Статус
В этой теме нельзя размещать новые ответы.

joni

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

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

    //Open the socket  
$handle = @fsockopen("udp://$host", 2701, $errno, $errstr, 1);
if (! $handle )  
echo "$errstr ($errno)<br>\r\n" ;  
else {  
    //Set read timeout  
stream_set_timeout ( $handle , $timeout );  
for ( $i = 0 ; $i < 3 ; $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 , 3 ). " s<br>\r\n" ;  
}  
fclose ( $handle );  
}  
?>

Если ставить любой не использующийся порт на удаленной машине - все "пингует" и ошибок нет.
Если ставлю Порт на котором висит какая то либо игра (CS например) то "пинг" не доходит.
Та же беда в принципе и в мониторингах для игровых серверов. Беда только на одной WEB машине (веб сервер).
машина стоит за nginx на самой машине апач и php4.
Подскажите в какую сторону копать, чтобы исправить?
 
Для начала поднять все логи (access.log, error.log, system.log, значения $errno, $errstr, etc) и посмотреть сообщения.

Еще возможно на машине фаерволом закрыты нужные порты или udp.
 
nmap обрабатывает данные запросы на udp порты. файерволов нет.
по логам вроде пусто.
 
Что-то не понятно как "пинг" должен "доходить" на открытый порт? То что мне видно, это что серверу игры посылается строка "echo this" и ждется ответ. Если ответа нет, то - ошибка. Я, конечно, не специалист по серверным играм, но может быть CS и не должна ничего отвечать на такие запросы??
 
Если ты хочешь фукцию пинга хоста то используй только порт для ICMP пакетов, как указал автор скрипта
$handle=fsockopen('udp://'.$host, 7, $errno, $errstr, $timeout);

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

Вопрос закрыт. проблему решил
Мой ТО капал мне на мозг, что там небыло файервола. а он был.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху