Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

PAUK-NET.RU - Бесплатный ADSL портал Чувашии _ Web-программирование _ PHP fsockopen

Автор: LLeSS Aug 31 2006, 09:38

кратко:

Код
<?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 Aug 31 2006, 12: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);
}
?>

Автор: karpen Aug 31 2006, 13:02

Цитата из книги "Протоколы TCP/IP", том 1 (в интернете легко её найти).

Цитата
UDP использует Internet Protocol для передачи сообщения от одной машины к другой и обеспечивает ту же самую ненадежную доставку сообщений, что и IP. UDP не использует подтверждения прихода сообщений, не упорядочивает приходящие сообщения и не обеспечивает обратной связи для управления скоростью передачи информации между машинами. Поэтому, UDP сообщения могут быть потеряны, размножены или приходить не по порядку. Кроме того, пакеты могут приходить раньше, чем получатель сможет обработать их. В общем можно сказать, что: UDP обеспечивает ненадежную службу без установления соединения и использует IP для транспортировки сообщений между машинами. Он предоставляет возможность указывать несколько мест доставки на одном компьютере.
Прикладные программы, использующие UDP, несут полную ответственность за проблемы надежности, включая потерю сообщений, дублирование, задержку, неупорядоченность или потерю связи. К несчастью, программисты часто игнорируют эти проблемы при разработке программ. Кроме того, поскольку программисты тестируют свои программы, используя надежные высокоскоростные локальные сети, тестирование может не выявить возможные ошибки. Таким образом, программы, использующие UDP и успешно работающие в локальной сети, будут аварийно завершаться в глобальных сетях TCP/IP.

Автор: jay Aug 31 2006, 14:35

Цитата(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 Aug 31 2006, 14:44

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

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


единственный вариант как я считаю. Загнать в цикл(10-15 попыток), и если хотябы одна отлично от офф-ланйна то сервак он-дайн

Автор: pavel Aug 31 2006, 18:18

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

PS. а stream_socket_client ?

Автор: jay Aug 31 2006, 19:38

у нас PHP 4, а это как я помню появилось только в пятой версии, ща проверю на др. компе, там 5-ая, посмотрим че полчится...

Автор: pavel Aug 31 2006, 19:53

Там серваки поддерживаются вплоть до такого:

Код
require_once 'Net\GameServerQuery\Protocol.php';

class Net_GameServerQuery_Protocol_Quake2 extends Net_GameServerQuery_Protocol
{

}


так что можно и поэксперементировать...
Хотя если залезть в Communicate.php, то можно понять, что чуваки приступ гениальности еще не успели словить, и попытаться сделать что-нибудь подобное но по своему

Автор: JoNy202 Aug 31 2006, 20:35

надо проверять не только соединение по определенному порту, а "общаться с сервером".

Автор: pavel Aug 31 2006, 21:20

Цитата(JoNy202 @ Aug 31 2006, 21:35) *
надо проверять не только соединение по определенному порту, а "общаться с сервером".


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

Net_GameServerQuery всякие статусы вроде возвращает для Quake3, HL2, UT3, Doom3, Battlefield, но не NFS, Warcraft или WoW. В версии с pear.net почему-то не вся поддержка, но в altavista.com можно найти... (а в гугле нельзя, гы smile.gif )

Автор: SiMM Sep 1 2006, 00:14

Никогда не понимал чудаков, которые задают вопросы и не читают ответы.

Автор: pavel Sep 1 2006, 00:32

честно говоря ответов типа "PHP4 forever" или "и в параллель без интеграции с апачем 5-ю версию мы поставить не можем, типа чтобы чисто по расписанию запускать и в БД записывать" я не услышал... уж извините, если нафлудил, больше не буду sad.gif

Автор: SiMM Sep 1 2006, 00:49

Во всей теме только два попадания - пост #3 (который вообще был проигнорирован тредстартером) и пост #9. Был бы это специализированный форум - все остальные посты были бы разумно снесены в топку как абсолютно бессмысленные.
При чём ведь даже в http://php.net/fsockopen сказано

Цитата(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 Sep 1 2006, 09:56

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


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

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

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

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


ты не по себе судишь, нет? или ты считаешь, что здесь должны только нечитающие писать (чтобы ты перед ними выделывался в стиле "прочитай http://здесь" или "этот вопрос от слишком буйной фантазии")

Автор: SiMM Sep 1 2006, 10:12

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

Автор: JoNy202 Sep 1 2006, 10:15

Цитата(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 Sep 1 2006, 11:33

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


Вспоминается старая заморская реклама правил дорожного движения, где маленькая девочка говорит "сбейте меня на скорости в 30 км/ч, и я максимум сломаю ногу, сбейте меня на скорости 90 км/ч и шансов выжить у меня будет 1 из 100". Спасибо, кстати, что ты утрудил себя вниманием ко мне.

Автор: LLeSS Sep 1 2006, 14:36

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

Автор: SiMM Sep 1 2006, 14:54

Жжошь.
Я пожалуй последний раз скажу - если человек не читает ответов - отвечать ему смысла нет.

Автор: LLeSS Sep 1 2006, 18:23

Цитата(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 Sep 2 2006, 10:42

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 Sep 2 2006, 18:45

Посмотрел на 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 Sep 2 2006, 22:25

спасибо тебе за помощь, думаю с остальными играми надо поступать аналогично и на будущее научится юзать сниферы...

Автор: LLeSS Sep 2 2006, 23:06

сенкс.

Автор: SiMM Sep 3 2006, 00:52

Цитата(pavel @ Sep 2 2006, 11:42) *
LLeSS, как ты спрашиваешь, так тебе и отвечают.
Вот ыменно. А то поставил некую абстрактную задачу - выяснить возможность соединения по UDP-порту с неизвестным приложением - а ты сиди, гадай, чего ему на самом деле нужно.

Автор: mgk Sep 29 2006, 10:31

сам столкнулся с такой проблемой...
с играми действительно сложно решить проблему к кажой игре надо писать свой запрос...
но со стандартными портами (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 Sep 29 2006, 11:08

Цитата(mgk @ Sep 29 2006, 11:31) *
но со стандартными портами (80,21) все ОК когда включен догда включен 100% правильный ответ правдо написано на perl:
Стандартность портов тут не при чём - не путайте мух с котлетами - http://ru.wikipedia.org/wiki/UDP и http://ru.wikipedia.org/wiki/TCP - разные вещи.

Автор: mgk Sep 29 2006, 20:11

Цитата(SiMM @ Sep 29 2006, 12:08) *
Стандартность портов тут не при чём - не путайте мух с котлетами - http://ru.wikipedia.org/wiki/UDP и http://ru.wikipedia.org/wiki/TCP - разные вещи.

фишка в том что он и с UDP нармально сканирует... эти порты =)
а вот с игровыми портами вилы двойные вылетают.. он их не видит =(
к ним надо обращаться шоб они ответили...причем к каждой игре посвойму о чем здесь уже говорили...

Автор: SiMM Sep 29 2006, 21:21

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

Автор: mgk Sep 29 2006, 21:39

Цитата(SiMM @ Sep 29 2006, 22:21) *
Этого не может быть потому что этого не может быть никогда. Специфика UDP такова.

сори... на самом деле не может быть... тупю =)
по TCP все лаях пока не дажеться ответа не откроеться сокет.
по UDP сокет открываеться всегда надо общаться шоб понять.

Автор: pavel Oct 1 2006, 01:16

Цитата(mgk @ Sep 29 2006, 11:31) *
$socket = IO::Socket::INET->new(Proto => 'tcp', PeerPort => $port, PeerAddr => $ip_addr);


таймауты!!! куда ж без них?

Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)