Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → [RU] Starcraft → [guide]Starcraft port tester

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 11

1 (edited by xpeh 20.08.2013 01:50)

Topic: [guide]Starcraft port tester

Сделал подарок для загнивающего Starcraft камунети - проверялку порта для старкрафта. Вот она.

Зачем открывать порт?
- Если хочешь создавать игры.

- Если в игре больше 2-х человек. В игре может быть максимум 1 игрок с закрытым портом, иначе начнутся жуткие лаги, к тому же будет тяжело определить, из-за кого лагает. Вероятность такого лучше свести до минимума.

Инструкция
1. Запустить Starcraft. Зайти на любой сервер. Логиниться не обязательно.
2. Зайти на страницу.
3. Ввести порт.
4. Нажать "отправить"
5. ???
6. Профит!

Как открыть порт:
ru.wikibooks.org/wiki/Порт
wiki.sc2tv.ru/index.php/Проброс_портов
www.portforward.com/english/appl … tindex.htm

Тулза пока в бете, к тому же, в php и html я нуп smile Жду отзывов.
Русская официальная страница: здесь.
English version: here.

Edit 19.08.2013: поправил ссылку.

2

Re: [guide]Starcraft port tester

Найс вещь.
Только бывают ещё ситуации, когда оба с реальными ипами и к ним могут заходить. Но вместе в одной игре находиться не могут. Но это уже другая история)

Do not ask for support in PM.

3

Re: [guide]Starcraft port tester

Какая, интересно?
"вместе в одной игре находиться не могут" - значит соединения между ними нет, ты же сам статью писал smile

4

Re: [guide]Starcraft port tester

Я про это и говорю, просто оно открытого порта не касается)

Do not ask for support in PM.

5

Re: [guide]Starcraft port tester

Прошу прощения за вопрос:
а нельзя исходник как-то заполучить? Или наводку относительно реализации.

Очень давно меня интересует аналогичная утилита, только пока не могу сообразить, как ее писать.
Если как в примере из учебника:

$fp = stream_socket_client("udp://$client:6112", $errno, $errstr);
if (!$fp) {
    echo "ОШИБКА: $errno - $errstr<br />\n";
}

- тогда почему-то порт всегда open...
Надо видимо какие-то хитрые udp-пакеты послать и ответы на них получить?

6

Re: [guide]Starcraft port tester

Разве вар3 не TCP? зачем udp?

7

Re: [guide]Starcraft port tester

iltmpz, такая проверка на открытие порта будет работать только с TCP.
UDP протокол работает без установки соединения. Для проверки открытого порта UDP нужно отправить на него пакет, который знает сервер, и затем ждать получения ответа.

Исходник скрипта xpeh прикладываю, там он отправляет пакет 0x03 SCGP_REQUESTJOIN2

+ show spoiler
<?php
    // config
    $defport = 6112;
    $timeout = 6;
    $debug = 0;
    
    $address=$_SERVER['REMOTE_ADDR'];
    if (isset($_REQUEST['port']) and
            (!strlen($_REQUEST['port'])==0))
        $port=$_REQUEST['port'];
    else
        unset($port);
?>
<html><head></head><body>
<h1>Starcraft port tester by xpeh</h1>
Your IP: <?php echo $address ?><br>
<form>
Your port:
<input name="port" type="text" value="<?php echo isset($port) ? $port : $defport ?>" size="6"><br>
<input type="submit">
</form>

<?php
    $request = "\x03\x00\x00\x00\x00\x00\x00\x00";
    
    if (!isset($port)) {
        exit();
    }

    if (($socket=socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) and
            (socket_connect($socket, $address, $port)))
    {
        $text="Connection successful on IP $address, port $port<br>\n";
    } 
    else {
        $text="Unable to connect<pre>".socket_strerror(socket_last_error())."</pre>";
    }
    // timeout 6 seconds
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$timeout, "usec"=>0)) or 
        print( "Can't set socket timeout: " . socket_strerror(socket_last_error()) ."<br>\n");
    echo $text;

    //$start_time = microtime();
    // php 5
    $start_time = microtime(true);
    if (socket_write($socket , $request))
        $text = "Sent request<br>";
    else 
        $text="Error while sending: ".socket_strerror(socket_last_error())."<br>\n";
    echo $text;

    if (!($buf = socket_read($socket, 2048))) {
        if ($debug) {
            $time = microtime(true) - $start_time;
            printf("Ping: %d ms<br>\n", $time * 1000);
        }
        //echo("socket_read() failed: reason: " . socket_strerror(socket_last_error($socket)) . "<br>\n" . 
        die('Port is <b><font color="red">closed</font></b><br>'. "\n");
    } else {
        echo 'Port is <b><font color="green">open</font></b><br>'."\n";
        // ebat moj huj.
        // 1. http://www.php.net/manual/en/function.microtime.php#99524
        // 2. tip microtime() - string!
        $time = microtime(true) - $start_time;
        //echo gettype(microtime());
        //, $start_time, "<br>\n";
        //echo "Ping: " . $time * 1000 . " ms<br>\n";
        printf("Ping: %d ms<br>\n", $time * 1000);
    }
    socket_close($socket);
    //echo $buf . "<br>\n";
    echo "</body></html>";

Suite, верно - Warcraft 3 использует только TCP https://us.battle.net/support/en/articl … figuration

Do not ask for support in PM.

8

Re: [guide]Starcraft port tester

HarpyWar, спасибо огромное, шикарно, как давно я об этом думал!
Ну и, конечно, огромное спасибо xpeh за такой подарок cool
Не силен я в сокетах, хотя и была идея запустить игру и поснифать сеть - какими пакетами ко мне стучатся, но для меня это целое дело, а тут - готовое решение!
Про открытый UDP-порт это я конечно тупанул tongue

Надо будет эту штуку к pvpgn приделать - чтобы хостам игр в личку писало что у него порты закрыты. А то новички понасоздают игр не настроив роутер, а потом сидят и удивляются, что к ним не заходит никто. smile

Добавлено: 02.12.2014 12:02

xpeh wrote:

- Если в игре больше 2-х человек. В игре может быть максимум 1 игрок с закрытым портом, иначе начнутся жуткие лаги, к тому же будет тяжело определить, из-за кого лагает. Вероятность такого лучше свести до минимума.

По вот этому еще вопрос, можно ли про это где-нибудь почитать?
Честно говоря, подумывал реализовать какой-нибудь NAT traversal, что-нибудь наподобие STUN, чтобы позволить хостить с закрытыми портами, а почему для более 2 человек это не получится?

9

Re: [guide]Starcraft port tester

Приделать к PvPGN проверку на открытый порт это хорошая идея!

Я не знаю как работают эти сетевые штуки, которые обходят NAT, но было бы здорово это реализовать. Где-то здесь давно проскакивала тема с человеком, который это сделал для старкрафта и пытался продавать свою сборку. Не получается найти.

Do not ask for support in PM.

10

Re: [guide]Starcraft port tester

HarpyWar wrote:

Я не знаю как работают эти сетевые штуки, которые обходят NAT, но было бы здорово это реализовать. Где-то здесь давно проскакивала тема с человеком, который это сделал для старкрафта и пытался продавать свою сборку. Не получается найти.

Есть такие достаточно современные интересные технологии, как ICE, как я понял - универсальное решение для соединения хостов разными способами, в зависимости от того, как они закрыты от внешнего мира. Развивается на базе UDP-протокола, используется в современном мире в основном для передачи аудио/видеоданных, но для наших целей по идее тоже должно подойти.
Нагуглил несколько opensource библиотек, но мой жизненный путь на данный момент проходит довольно далеко от программирования, и мысли о работе с сокетами, а также о подключении чужих больших и непонятных библиотек вызывают у меня панику smile
Хотя скорее всего вдумчивое изучение, подключение библиотеки и написание простенького проекта для соединения нескольких клиентов у грамотного человека займет минимум времени.

(Наверно, весь мой оффтоп лучше выделить в отдельную тему...)

11

Re: [guide]Starcraft port tester

все это конечно супер, но все равно переписывать коннект-модули в пвпгн - работа не на один день.

Posts: 11

Pages 1

You must login or register to post a reply

Who now at forum

Currently view post: 1 guest, 0 registered users

forums.pvpgn.pro → [RU] Starcraft → [guide]Starcraft port tester