<b>Как играть нескольким игрокам с 1 внешним ip в одной игре</b><br /><br />Кто не знает, что такое NAT и имеет ли эта статья к нему вообще отношение - может почитать <a href="http://ru.wikibooks.org/wiki/Порт" target="_blank">это</a> и <a href="http://ru.wikibooks.org/wiki/Порт/NAT" target="_blank">это</a>.<br /><br /><a href="http://harpywar.com/?a=articles&b=1&c=0&d=27&lang=ru" target="_blank">Соединение в Battle.Net играх</a>.<br /><br /><br /><br /><br />Для War 3 все сравнительно просто - те, кто сидят за 1 ip, не должны хостить игру. Starcraft и War 2 же требуют соединения между всеми клиентами.<br /><br />Причина проблем вот в чем.<br /><br />Желающий зайти в игру клиент получает <i>внешний</i> iport других клиентов от сервера или хоста и пытается с ними соединиться. Даже если этот клиент находится в той же локалке (за тем же NAT-ом), что и джойнящийся - он все равно пытается установить соединение с внешним ip NAT рутера, т.к. он просто не знает про существование NAT-а. Проблема в том, что в RFC для NAT не описано, как NAT должен обрабатывать такую ситуацию (иногда это называют <i>NAT loopback</i>), и несмотря на то, что подавляющее большинство прошивок сделаны на базе линупса, который сам по себе эти соединения разрешает - среди производителей рутеров "кто как хочет, тот так и др...", т.е. рутер их или разрешает, или нет. Это ничем не лечится (если нет возможности поставить альтернативную прошивку вроде DD-WRT / OpenWRT), только заменой рутера на тот, который это может.<br /><br />Единственное, что можно в такой ситуации сделать - это протестировать, какие модели рутеров с какими версиями прошивки разрешают соединения на свой внешний ip из внутренней сети, а какие нет, и покупать рутер, который это разрешает.<br /><br /><b>Developers, Developers, Developers!</b><br /><br />Идеальным способом было бы как сделано <a href="http://nattest.net.in.tum.de/?mod=start" target="_blank">здесь</a> - <a href="http://nattest.net.in.tum.de/?mod=results" target="_blank">база данных</a> по рутерам + программа-тестер, которая эту базу заполняет. Соответственно, ищется разработчик для нее и для серверной части. Программа желательно должна быть на нативном (компилируемым) языке, т.е. не требующим дополнительных библиотек вроде Java или .Net. С алгоритмом тестирования и серверной частью могу помочь.<br /><br />Все, что тут написано, относится не только к Battle.Net играм - оно относится к любой ситуации, когда клиенты соединяются друг с другом и они могут оказаться за одним и тем же NAT-ом, например, различные p2p программы, интернет телефония. С точки зрения совместимости с программами, которые не знают про существование NAT, было бы гораздо правильнее такие соединения разрешать. Можно ли как-то написать петицию к производителям NAT рутеров? <br /><br /><b>Алгоритм проверки.</b><br />1. Тестируем портмаппинг снаружи. Сервисов для этого навалом, как на сайтах p2p файлообменников, так и на <a href="http://www.portforward.com/help/portcheck.htm" target="_blank">portforward.com</a> (там могут проверять отдельно UDP). Если добавить поддержку UPnP, можно пытаться открыть порт самому. Если порт закрыт, заканчиваем, иначе переходим к 2. Хотя можно оставить портмэппинг на совести юзера и предложить юзеру перейти к 2, на случай, если у него инета нет или с ним чето не то.<br />2. Если 1. сработал, открываем новый сокет, и с него проверяем портмэппинг изнутри. Если соединение работает в <b>обе</b> стороны, то все работает, иначе нет.<br />3. Открываем юзеру окно с результатами теста (или сразу страницу в браузере). Предлагаем ему вбить туда данные рутера (их можно прочесть опять же через UPnP) и потом отправляем на сайт.<br /><br /><b>Более простой алгоритм ручной проверки.</b><br />1. Качаем Blue's port tool (что-то вроде netcat с GUI). <a href="http://s51.radikal.ru/i133/1002/e6/555bcdb02f9a.gif" target="_blank">GIFRAR</a>, сохранить на диск и открыть винраром.<br />2. Запускаем. В графе port пишем порт, ставим галку на TCP. Жмем на listen. Соответствующий порт должен быть открыт на рутере.<br />3. Проверяем, открыт ли порт снаружи. <a href="http://www.yougetsignal.com/tools/open-ports/" target="_blank">http://www.yougetsignal.com/tools/open-ports/</a> - здесь заодно можно узнать и свой внешний ip. Если порт открыт - читаем дальше.<br />4. Запускаем браузер, пишем в адресной строке http://внешний_ip:порт/. В окне Port tool должно появиться что-то вроде <br /><!--code1--><div class="scriptcode"><!--ecode1-->GET / HTTP/1.1<br />blabla<br /><!--code2--></div><!--ecode2--><br />Если появилось - поздравляю, все работает. Нет - ну и суда нет.<br /><br /><b>Алгоритм ручной проверки.</b><br />1. <a href="http://joncraton.org/media/files/nc111nt.zip" target="_blank">Качаем netcat</a>.<br />2. Открываем 2 консоли.<br />В 1й пишем: <i>nc -L -p 6112</i> <br />(Программа слушает порт 6112 TCP. Он может быть любым, должен быть прокинут на рутере и не занят. Для UDP добавьте <i>-u</i>)<br />3. Во 2й пишем: <i>nc external_ip 6112</i> <br />Вместо external_ip пишем свой внешний ip, его можно узнать тут: 2ip.ru. Для UDP опять добавьте <i>-u</i>)<br />4. Если программа не вышла, попробуйте что-то написать в окно и нажать Enter. Текст должен появиться во втором окне. Напишите что-то во втором окне - текст должен появиться в первом окне. Если получилось, поздравляю, у вас все работает.<br />Если хоть 1 шаг не работает - значит нефарт, играть вам не светит.<br /><br />Апдейты будут,скорее всего <a href="http://forums.harpywar.com/viewtopic.php?id=298" target="_blank">здесь</a><br /><br />Э, а чего картинки не работают?