IPB

Здравствуйте, гость ( Вход | Регистрация )

> PHP fsockopen
LLeSS
сообщение Aug 31 2006, 09:38
Сообщение #1


N.N.G.
***

Группа: Posters
Сообщений: 292
Регистрация: 16.10.2005
Пользователь №: 103



кратко:
Код
<?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"
Прочитал много мануало, читал в нете. Ничего не помогло. едиственное отличие ТЦП и УДВ это время подключеия к порты. В книгах его вообще нет.

Сообщение отредактировал LLeSS - Aug 31 2006, 10:49
Вернуться к началу страницы
 
+Цитировать сообщение
2 страниц V  < 1 2  
Создать новую тему
Ответов (20 - 30)
pavel
сообщение Sep 2 2006, 10:42
Сообщение #21


Пользователь
**

Группа: Posters
Сообщений: 116
Регистрация: 22.5.2006
Из: Чебоксары
Пользователь №: 616



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
Сообщение #22


Пользователь
**

Группа: Posters
Сообщений: 116
Регистрация: 22.5.2006
Из: Чебоксары
Пользователь №: 616



Посмотрел на 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
Сообщение #23


Супер постер
Иконка группы

Группа: Global moder
Сообщений: 994
Регистрация: 6.12.2005
Из: http://pauk.net.ru/
Пользователь №: 179



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

Сообщение отредактировал jay - Sep 2 2006, 22:25


--------------------
Software Is Like Sex, It's Better When It's Free



Вернуться к началу страницы
 
+Цитировать сообщение
LLeSS
сообщение Sep 2 2006, 23:06
Сообщение #24


N.N.G.
***

Группа: Posters
Сообщений: 292
Регистрация: 16.10.2005
Пользователь №: 103



сенкс.
Вернуться к началу страницы
 
+Цитировать сообщение
SiMM
сообщение Sep 3 2006, 00:52
Сообщение #25


PAUK-NET.RU TEAM
Иконка группы

Группа: Admin
Сообщений: 4,715
Регистрация: 11.7.2005
Из: ЮЗР
Пользователь №: 3



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





Guests






сам столкнулся с такой проблемой...
с играми действительно сложно решить проблему к кажой игре надо писать свой запрос...
но со стандартными портами (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
Сообщение #27


PAUK-NET.RU TEAM
Иконка группы

Группа: Admin
Сообщений: 4,715
Регистрация: 11.7.2005
Из: ЮЗР
Пользователь №: 3



Цитата(mgk @ Sep 29 2006, 11:31) *
но со стандартными портами (80,21) все ОК когда включен догда включен 100% правильный ответ правдо написано на perl:
Стандартность портов тут не при чём - не путайте мух с котлетами - UDP и TCP - разные вещи.
Вернуться к началу страницы
 
+Цитировать сообщение
Гость_mgk_*
сообщение Sep 29 2006, 20:11
Сообщение #28





Guests






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

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


PAUK-NET.RU TEAM
Иконка группы

Группа: Admin
Сообщений: 4,715
Регистрация: 11.7.2005
Из: ЮЗР
Пользователь №: 3



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





Guests






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

сори... на самом деле не может быть... тупю =)
по TCP все лаях пока не дажеться ответа не откроеться сокет.
по UDP сокет открываеться всегда надо общаться шоб понять.
Вернуться к началу страницы
 
+Цитировать сообщение
pavel
сообщение Oct 1 2006, 01:16
Сообщение #31


Пользователь
**

Группа: Posters
Сообщений: 116
Регистрация: 22.5.2006
Из: Чебоксары
Пользователь №: 616



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


таймауты!!! куда ж без них?
Вернуться к началу страницы
 
+Цитировать сообщение

2 страниц V  < 1 2
ОтветитьСоздать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 27th April 2024 - 23:03