Воскресенье, 22 Декабря 2024, 18:11

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
PHP-master server, NAT-Facilitator и механика взаимодействия
Abel399Дата: Вторник, 05 Января 2016, 16:19 | Сообщение # 1
Surpass your limits. Right now.
Сейчас нет на сайте
Здравствуйте, уважаемые участники форума! Текста и лишних слов(такова моя манера речи... сложно говорить конкретно) будет много, так что если все же решитесь - терпения вам ^_^

Версия Unity: 5.0.2f1 (конечно, можно обновиться на новый, изучить его UNet(не копал, но все хвалят c: ), но пока вопрос стоит другим ребром).

В настоящий момент при организации мультиплеера в Unity возникли небольшие загвоздки с nat punchthrough... Используются самую малость дописанные PHP скрипты мастер сервера из данной темы. Работает без нареканий, все прекрасно (MainMenu.js и PHPMasterServerConnect.js из оригинала просмотрены и добавлен лишь необходимый функционал). А вот с NAT-Facilitator'ом(2.0.0, скачан и скомпилирован с сайта unity, т.е. используем свой собственный компьютер с ним) уже загвоздки. При необходимости пробивки Nat'а клиенты отказываются подключаться к фасилитэйтору, на одном клиенте греша на то, что он недоступен, на другом просто зависая. На компьютере с facilitator'ом порты проброшены(вообще, там даже режим Bridge ставился, т.ч. это не аргумент), ip белый, внешний, {Firewall, брандмауэр} - отключены. Еще один прикол в том, что когда еще решалось использовать стандартные Master Server и Facilitator, то работало все идеально, подключение было без проблем, оба клиента коннектились. Причиной отказа от Master Server'a была кривая реализация метода UnregisterHost на мастер-сервере (скорее всего это последний вариант, что остается, если здесь ничего не решится - искать проблему, из-за которой не происходит очищение таблицы на мастер-сервере. хотя, она более-менее ясна. если я не ошибаюсь, а мой английский не до такой степени уж плох, то community unity уже обсуждало этот вопрос, и проблемой видимо было то, что юнити не отправляет название таблицы для поиска в методе UnregisterHost, но может я все-таки неправильно понял, и кто-нибудь меня поправит). Из-за невозможности удалить хост с Master Server'а, пока он не выключен (т.е. когда он уже не может достучаться до хоста, то его благополучно подчищают), решением было использовать PHP Master Server, который в свою очередь теперь куралесит с Facilitator'ом.
Поиски по данной проблеме привели к этому обсуждению. Из нее мне все же наводит сомнения то, что похоже Facilitator до сих пор должен взаимодействовать с Master Server'ом от Unity. Конечно, там лишь сказано, что он использует это только для определения external-ip, но кто же его знает wink (да-да, вряд ли они оба обращаются к одному (локальному..?)хранилищу(да, наверняка, там обычный массив, список, любая коллекция в ОЗУ))
Для большего спокойствия - с отключенным useNat компьютеры коннектятся безупречно (проблема именно в Facilitator'e).

В оригинале PHP Master Server'a с форума Unity имеются строки:
Код
var conn = GetComponent(PHPMasterServerConnect);
conn.gameName = GUI.TextField (Rect (215, 300, 400, 25), conn.gameName);
//Вышеуказанное привожу, чтобы не возникало вопросов откуда переменная conn... она вообще отношения сейчас не имеет никакого, но заранее прибил возможный вопрос...
Network.InitializeServer (32, parseInt(portString), !Network.HavePublicAddress ());
MasterServer.RegisterHost (conn.gameType, conn.gameName, "");

Что, конечно же, как бы намекает на то, что мастер-сервер от unity запускается.

Собственно вопросы:
1) Кто-нибудь уже сталкивался с такими проблемами? Методы их решения? (конечно, вы можете сказать перейти Photon/SmartFox/ElectroServer(он загнулся?) и другие, но сейчас решается вопрос именно по стандартным средствам unity)
2) Копался ли кто-нибудь в коде Master Server'a? Даже технология его работы упростит (maybe) неизбежное изучение исходников.
3) В добавление к вопросу 2 - Обходные или валидные пути решения проблемы с UnregisterHost? (кроме как "зачудить" отключение сервера, мастер нас кикнет, а потом через промежуток времени заново его создать и законнектиться всем клиентам, что, кстати, может и не сработать, если "мистическая" связь facilitator'a и master server'a все же есть)
4) Если вы не сталкивались с этим, то что по вашему мнению здесь имеет подводные камни? (Очень логично, думаю, было бы посмотреть на Network.player.guid, который, если я правильно понимаю, выдает нам Facilitator как идентификатор при соединении с ним. Значит, если он неправильно определен(мы не приконнектились к искомому facilitator'у), то и NAT Punchthrough между клиентами невозможен, не так ли? Но почему тогда он коннектится, если мы установили master-server от unity на компьютере?..)

Спасибо большое за ваше внимание. Если где-то я сказанул бред, то поправьте меня (да, со мной бывает такое. возможно, я неправильно что-либо понимаю).

Всех с Наступающим Новым Годом!!! santa Счастья, успехов вам в грядущем 2016-ом, валидного кода и компилятора без ошибок!) :holiday:

P.S>Надеюсь, на форуме не настало заранее 1 января :"D
P.S.S:
Да, все же скажу к чему все эти заморочки и зачем мне удаление сервера до его выключения. Клиент нажимает кнопку поиска, идут запросы на мастер-сервер, там он находит уже открытые сервера других игроков, пробует к ним коннектиться, если, в итоге, никуда не законнектился - создает сервер сам(именно здесь довольно полезен nat facilitator). Сервера (если они пусты, еще нет игроков на них, т.е. неизвестно - а они вообще могут быть таковыми..) продолжают запросы на мастер-сервер, как и обычный клиент. И если они смогли законнектиться на другой сервер, то свой они прикрывают и становятся обычным клиентом. Так открывается лобби, в котором собираются игроки. Возможное количество - от 2х до 4х. Когда все игроки нажали "Ready", начинается отсчет до запуска игры (не знаю, может быть, можно оставить возможность приконнектиться в этот промежуток). Пока идет отсчет - отправляется UnregisterHost(т.е. нам больше числиться в серверах не нужно, нам не нужны больше игрок для данной сессии игры). По окончанию - стартуется игра, сервер - игрок, к нему все законнекчены либо напрямую, либо через facilitator.

Добавлено (05 января 2016, 16:19)
---------------------------------------------
UP, думаю, многие успешно отошли от НГ < 3

Сообщение отредактировал Abel399 - Вторник, 29 Декабря 2015, 16:54
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг