Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PHP fsockopen
PAUK-NET.RU - Бесплатный ADSL портал Чувашии > Информационные технологии > Интернет > Web-программирование
LLeSS
кратко:
Код
<?php  
  
  function status_tcp($ip,$port)  
  {  
  if ($ip=="") {
         $ip="192.168.1.2";
                }
  if (@fsockopen($ip, $port, $errno, $errstr, 0.3)) {
             echo "<font color=blue>OnLine</font><p>";
            } else {
             echo "<font color=red>OffLine</font><p>";
                   }  
  }

  function status_udp($ip,$port)  
  {  
  if ($ip=="") {
          $ip="udp://192.168.1.2";
                 }
  if (@fsockopen($ip, $port, $errno, $errstr,1)) {
              echo "<font color=blue>OnLine</font><p>";
             } else {
                  echo "<font color=red>OffLine</font><p>";
                      }  
  }  
  
?>

Основная чать. В ней происходят все расчеты

Код
<CENTER>
  <TABLE BORDER CELLPADDING=5>
  <CAPTION ALIGN=top><h2>Статус серверов</h2>
  </CAPTION>
    <TR>
      <TD><b> Название сервера</b> </TD>
      <TD><b> IP - сервера</b> </TD>
      <TD><b> Статус сервера</b> </TD>
      <TD><b> Дополнительно </b> </TD>
    </TR>
      
    <TR>
      <TD NOWRAP >NFS Undeground 1.4</TD>
      <TD>wow.cheb.ru</TD>
      <TD>  <?php status_tcp("",10800) ?>
      <TD> <a href="http://wow.cheb.ru/forums/index.php?showtopic=15">Настройка игры</a>  <p>
    </TR>

  <TR>
      <TD NOWRAP >Quake 3 1.32 </TD>
      <TD>wow.cheb.ru</TD>
      <TD>  <?php status_udp("", 27960) ?>
      <TD> <a href="http://wow.cheb.ru/forums/index.php?showtopic=8&pid=18&st=0&#entry18">Настройка игры</a>  <p>

    </TR>


Теперь проблема. для открытия тцп порта все нормально и правильно. Но когда и хочю проверить UDP порт. Он мне всегда выдает "OnLine"
Прочитал много мануало, читал в нете. Ничего не помогло. едиственное отличие ТЦП и УДВ это время подключеия к порты. В книгах его вообще нет.
LInfo
Пример 2. Using UDP connection
Код
<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
   echo "ERROR: $errno - $errstr<br />\n";
} else {
   fwrite($fp, "\n");
   echo fread($fp, 26);
   fclose($fp);
}
?>
karpen
Цитата из книги "Протоколы TCP/IP", том 1 (в интернете легко её найти).
Цитата
UDP использует Internet Protocol для передачи сообщения от одной машины к другой и обеспечивает ту же самую ненадежную доставку сообщений, что и IP. UDP не использует подтверждения прихода сообщений, не упорядочивает приходящие сообщения и не обеспечивает обратной связи для управления скоростью передачи информации между машинами. Поэтому, UDP сообщения могут быть потеряны, размножены или приходить не по порядку. Кроме того, пакеты могут приходить раньше, чем получатель сможет обработать их. В общем можно сказать, что: UDP обеспечивает ненадежную службу без установления соединения и использует IP для транспортировки сообщений между машинами. Он предоставляет возможность указывать несколько мест доставки на одном компьютере.
Прикладные программы, использующие UDP, несут полную ответственность за проблемы надежности, включая потерю сообщений, дублирование, задержку, неупорядоченность или потерю связи. К несчастью, программисты часто игнорируют эти проблемы при разработке программ. Кроме того, поскольку программисты тестируют свои программы, используя надежные высокоскоростные локальные сети, тестирование может не выявить возможные ошибки. Таким образом, программы, использующие UDP и успешно работающие в локальной сети, будут аварийно завершаться в глобальных сетях TCP/IP.
Jay
Цитата(LInfo @ Aug 31 2006, 13:34) *
Пример 2. Using UDP connection
Код
<?php
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
   echo "ERROR: $errno - $errstr<br />\n";
} else {
   fwrite($fp, "\n");
   echo fread($fp, 26);
   fclose($fp);
}
?>

всегда выполняется то что после else неважно открыт такой порт на удаленной машине или нет... все уже перепробовал...
LLeSS
такие наивные... .я это уже все 100 раз пробовал smile.gif)) вы че думаете... я вообще нниче непробывал. в это то и проблема

Цитата
Теперь проблема. для открытия тцп порта все нормально и правильно. Но когда и хочю проверить UDP порт. Он мне всегда выдает "OnLine"
Прочитал много мануало, читал в нете. Ничего не помогло. едиственное отличие ТЦП и УДВ это время подключеия к порты. В книгах его вообще нет.


единственный вариант как я считаю. Загнать в цикл(10-15 попыток), и если хотябы одна отлично от офф-ланйна то сервак он-дайн
pavel
Лучше проверять через определенный интервал (5 мин?) и записывать куда-нибудь, а в "Основная часть" оттуда читать...
Еще был какой-то Net_GameServerQuery в PEAR...

PS. а stream_socket_client ?
Jay
у нас PHP 4, а это как я помню появилось только в пятой версии, ща проверю на др. компе, там 5-ая, посмотрим че полчится...
pavel
Там серваки поддерживаются вплоть до такого:
Код
require_once 'Net\GameServerQuery\Protocol.php';

class Net_GameServerQuery_Protocol_Quake2 extends Net_GameServerQuery_Protocol
{

}


так что можно и поэксперементировать...
Хотя если залезть в Communicate.php, то можно понять, что чуваки приступ гениальности еще не успели словить, и попытаться сделать что-нибудь подобное но по своему
JoNy202
надо проверять не только соединение по определенному порту, а "общаться с сервером".
pavel
Цитата(JoNy202 @ Aug 31 2006, 21:35) *
надо проверять не только соединение по определенному порту, а "общаться с сервером".


К несчастью, разработчики игр не любят, чтобы всякие левые чуваки из скритов "общались" с их серваками....

Net_GameServerQuery всякие статусы вроде возвращает для Quake3, HL2, UT3, Doom3, Battlefield, но не NFS, Warcraft или WoW. В версии с pear.net почему-то не вся поддержка, но в altavista.com можно найти... (а в гугле нельзя, гы smile.gif )
SiMM
Никогда не понимал чудаков, которые задают вопросы и не читают ответы.
pavel
честно говоря ответов типа "PHP4 forever" или "и в параллель без интеграции с апачем 5-ю версию мы поставить не можем, типа чтобы чисто по расписанию запускать и в БД записывать" я не услышал... уж извините, если нафлудил, больше не буду sad.gif
SiMM
Во всей теме только два попадания - пост #3 (который вообще был проигнорирован тредстартером) и пост #9. Был бы это специализированный форум - все остальные посты были бы разумно снесены в топку как абсолютно бессмысленные.
При чём ведь даже в мануале сказано
Цитата(http://php.net/fsockopen @ Warning)
UDP sockets will sometimes appear to have opened without an error, even if the remote host is unreachable. The error will only become apparent when you read or write data to/from the socket. The reason for this is because UDP is a "connectionless" protocol, which means that the operating system does not try to establish a link for the socket until it actually needs to send or receive data.
Но мануалы у нас даже если и читают, то дальше примеров не идут wink.gif
pavel
Цитата(SiMM @ Sep 1 2006, 01:49) *
мануалы у нас даже если и читают, то дальше примеров не идут


3-й - вообще не ответ и поставленной проблеммы не решает (намек на то, что это проблемма неразрешимая? но люди ж вроде как-то решали)
9-й - скорее пожелание
а из 6-го не должно было стать понятно, что для решения поставленной проблеммы используется такая-то функция, а если надо больше (типа "общение"), то используется такая-то библиотека ?
ты кстати сам-то понял че спросили? LLeSS, хотелось бы услышать твое мнение

Цитата(SiMM @ Sep 1 2006, 01:49) *
Был бы это специализированный форум - все остальные посты были бы разумно снесены в топку как абсолютно бессмысленные.
л

основания? опыт? если бы в форуме писали только ответы вроде 3-го и 9-го, то и задавать в него вопросы осбого смысла бы не было: иди сразу в мануал, там нет - иди в гугл, там нет - значит этого вообще нет и не задавай глупых вопросов

Цитата(SiMM @ Sep 1 2006, 01:49) *
мануалы у нас даже если и читают, то дальше примеров не идут


ты не по себе судишь, нет? или ты считаешь, что здесь должны только нечитающие писать (чтобы ты перед ними выделывался в стиле "прочитай здесь" или "этот вопрос от слишком буйной фантазии")
SiMM
Цитата(pavel @ Sep 1 2006, 10:56) *
или ты считаешь, что здесь должны только нечитающие писать (чтобы ты перед ними выделывался в стиле "прочитай здесь" или "этот вопрос от слишком буйной фантазии")
Если ты из лоботрясов - ты мне не интересен и можешь не утруждать себя вниманием ко мне wink.gif
JoNy202
Цитата(pavel @ Sep 1 2006, 10:56) *
3-й - вообще не ответ и поставленной проблеммы не решает (намек на то, что это проблемма неразрешимая? но люди ж вроде как-то решали)

Это намек, что нужно читать RFC протокола и RFC сервера, прежде чем их использовать.

Цитата(pavel @ Sep 1 2006, 10:56) *
9-й - скорее пожелание

Это дельный совет из личного опыта wink.gif

Цитата(pavel @ Sep 1 2006, 10:56) *
основания? опыт? если бы в форуме писали только ответы вроде 3-го и 9-го, то и задавать в него вопросы осбого смысла бы не было: иди сразу в мануал, там нет - иди в гугл, там нет - значит этого вообще нет и не задавай глупых вопросов

В сказку попал ??? smile.gif Вот мне лично лень, открывать мануал, сделать Ctrl C, потом вернуться на форум и сделать Ctrl V, тратить трафик на поиск более конкретного ответа, вот ссылку дать могу. Кому надо, тот найдет, достаточно дать правильное направление.
pavel
Цитата(SiMM @ Sep 1 2006, 11:12) *
Если ты из лоботрясов - ты мне не интересен и можешь не утруждать себя вниманием ко мне wink.gif


Вспоминается старая заморская реклама правил дорожного движения, где маленькая девочка говорит "сбейте меня на скорости в 30 км/ч, и я максимум сломаю ногу, сбейте меня на скорости 90 км/ч и шансов выжить у меня будет 1 из 100". Спасибо, кстати, что ты утрудил себя вниманием ко мне.
LLeSS
вы непоняли вопрос? я бы хотел получить в итоге работоспособный скрипт. В этом скрипте у меня работает тока 50%(TCP) из 10 попытток 1 ложная. Остальные 50% (UDP) он всегда выдает положительный ответ. и ненадо влудить. типа ты нуб иди почитай книгу, иди в гугл, иди тудато смотри тото. Если вы незнаете, нехотите то непишите. Я ни одного ответа неуслышал как мне сделать работоспособный скрипт. тока советы и цепляние к словам.
SiMM
Жжошь.
Я пожалуй последний раз скажу - если человек не читает ответов - отвечать ему смысла нет.
LLeSS
Цитата(SiMM @ Sep 1 2006, 01:14) *
Никогда не понимал чудаков, которые задают вопросы и не читают ответы.

Оскорбляешь... и не говоришь конкретного ответа

Цитата(SiMM @ Sep 1 2006, 11:12) *
Если ты из лоботрясов - ты мне не интересен и можешь не утруждать себя вниманием ко мне wink.gif

опять оскорбляешь и ничего толкового

Цитата(LLeSS @ Sep 1 2006, 15:36) *
вы непоняли вопрос? я бы хотел получить в итоге работоспособный скрипт. В этом скрипте у меня работает тока 50%(TCP) из 10 попытток 1 ложная. Остальные 50% (UDP) он всегда выдает положительный ответ. и ненадо влудить. типа ты нуб иди почитай книгу, иди в гугл, иди тудато смотри тото. Если вы незнаете, нехотите то непишите. Я ни одного ответа неуслышал как мне сделать работоспособный скрипт. тока советы и цепляние к словам.

ПО русски написал


Цитата(SiMM @ Sep 1 2006, 15:54) *
Жжошь.
Я пожалуй последний раз скажу - если человек не читает ответов - отвечать ему смысла нет.

Не строй из себя крутого чувака. Молодец если знаешь. На деле помочь неможешь... помолчи
pavel
SiMM, а вот не говорил бы ты намеками, и не возникало бы у тебя сомнений, что их у тебя поняли.

LLeSS, как ты спрашиваешь, так тебе и отвечают. Все равно надо будет что-то туда посылать и проверять результат. Если там Quake, то попробуй так (тут PHP 4.2+):
Код
  function getvalue($srv_value, $srv_data)
  {
    $srv_value = array_search ($srv_value, $srv_data);
    if ($srv_value === false) {
      return false;
    } else {
      return $srv_data[$srv_value+1];
    }
  }

  function status_quake3($ip, $port)  
  {
    $result = false;
    $socket = fsockopen("udp://".$ip, $port, $errno, $errstr, 50);
    if ($socket === false) {
      echo "[$errno] - $errstr<br>\n";
    } else {
      socket_set_timeout($socket, 50);

      fwrite($socket, "\xFF\xFF\xFF\xFFgetstatus\x00");
      $s = fread($socket, 2048);

      if ($s) {

        $players_info = explode("\n", $s);
        $game_info = explode("\\", $players_info[1]);

        $sv_hostname = getvalue("sv_hostname", $game_info);
        if ($sv_hostname) {
          echo "$sv_hostname\n";
          echo getvalue("g_gametype", $game_info); echo "\n";
          echo getvalue("gamename", $game_info); echo "\n";
          echo getvalue("version", $game_info); echo "\n";
          echo getvalue("mapname", $game_info); echo "\n";
          echo getvalue("sv_maxclients", $game_info); echo "\n";
          echo getvalue("g_needpass", $game_info); echo "\n";

          $result = true;
        }
      }
    }
    fclose($socket);

    return $result;
  }  

  if (status_quake3("127.0.0.1", 27960)) {
    echo "true\n";
  } else {
    echo "false\n";
  }
pavel
Посмотрел на 213.24.223.171, в скрипте надо поменять следующие строки:
...
$socket = fsockopen("udp://".$ip, $port, $errno, $errstr, 30);
...
socket_set_timeout($socket, 3);
...

в 19:42 вернуло
sv_hostname: Cheboksary q3 OSP server
g_gametype: 1
gamename: baseq3
version: Q3 1.32 win-x86 Oct 7 2002
mapname : q3tourney2
sv_maxclients: 20
g_needpass: 0

а в 19:43
sv_hostname: Cheboksary q3 OSP server
g_gametype: 1
gamename:
version:
mapname :
sv_maxclients:
g_needpass:
Jay
спасибо тебе за помощь, думаю с остальными играми надо поступать аналогично и на будущее научится юзать сниферы...
LLeSS
сенкс.
SiMM
Цитата(pavel @ Sep 2 2006, 11:42) *
LLeSS, как ты спрашиваешь, так тебе и отвечают.
Вот ыменно. А то поставил некую абстрактную задачу - выяснить возможность соединения по UDP-порту с неизвестным приложением - а ты сиди, гадай, чего ему на самом деле нужно.
mgk
сам столкнулся с такой проблемой...
с играми действительно сложно решить проблему к кажой игре надо писать свой запрос...
но со стандартными портами (80,21) все ОК когда включен догда включен 100% правильный ответ правдо написано на perl:

$socket = IO::Socket::INET->new(Proto => 'tcp', PeerPort => $port, PeerAddr => $ip_addr); #делаем соединение
if($socket) #если оно успешно, то
{
print ("$ip_addr:$port \n");
print("is open \n"); #сообщаем, что порт открыт
}
SiMM
Цитата(mgk @ Sep 29 2006, 11:31) *
но со стандартными портами (80,21) все ОК когда включен догда включен 100% правильный ответ правдо написано на perl:
Стандартность портов тут не при чём - не путайте мух с котлетами - UDP и TCP - разные вещи.
mgk
Цитата(SiMM @ Sep 29 2006, 12:08) *
Стандартность портов тут не при чём - не путайте мух с котлетами - UDP и TCP - разные вещи.

фишка в том что он и с UDP нармально сканирует... эти порты =)
а вот с игровыми портами вилы двойные вылетают.. он их не видит =(
к ним надо обращаться шоб они ответили...причем к каждой игре посвойму о чем здесь уже говорили...
SiMM
Цитата(mgk @ Sep 29 2006, 21:11) *
фишка в том что он и с UDP нармально сканирует... эти порты =)
Этого не может быть потому что этого не может быть никогда. Специфика UDP такова.
mgk
Цитата(SiMM @ Sep 29 2006, 22:21) *
Этого не может быть потому что этого не может быть никогда. Специфика UDP такова.

сори... на самом деле не может быть... тупю =)
по TCP все лаях пока не дажеться ответа не откроеться сокет.
по UDP сокет открываеться всегда надо общаться шоб понять.
pavel
Цитата(mgk @ Sep 29 2006, 11:31) *
$socket = IO::Socket::INET->new(Proto => 'tcp', PeerPort => $port, PeerAddr => $ip_addr);


таймауты!!! куда ж без них?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.