#c# #networking #xna #portforwarding #upnp
#c# #сеть #xna #восстановление портов #upnp
Вопрос:
Я довольно новичок в сетевых технологиях, и lidgren значительно упростил для меня процесс добавления многопользовательских возможностей в мою игру XNA для ПК. Я тестировал по сети, настраивая свой ноутбук рядом со мной, и он отлично работал. Проблема в том, что я отправил копию своей игры другу в Нидерландах, и она не может подключиться ко мне. Я настроил его так, чтобы один человек был хостом, а другие люди были клиентами, которые подключались к этому хосту.
Хост настраивает сервер следующим образом:
Config = new NetPeerConfiguration("game");
Config.Port = 14242;
Config.EnableUPnP = true;
Config.MaximumConnections = 3;
Config.EnableMessageType(NetIncomingMessageType.ConnectionApproval);
Server = new NetServer(Config);
Server.Start();
Server.UPnP.ForwardPort(14242, "Forlorn Forest");
Вот исключение, которое ForwardPort выдает при сбое и выдает «Неверный запрос»:
И два веб-исключения, которые генерируются:
В деталях исключения что-то говорится о закрытии соединения удаленным хостом и невозможности считывания данных из транспортного соединения:
Есть какие-либо мысли относительно того, что здесь может происходить? UPnP включен на моем маршрутизаторе. Я взглянул на сетевой трафик с помощью WireShark и вижу, что он отображает искаженные пакеты, хотя я не вмешивался ни в один код Lidgren, поэтому я не уверен, почему это так.
Комментарии:
1. Я добавил точку останова в «internal void ExtractServiceUrl (string resp)», и она получает и устанавливает статус на Доступный, а затем снова переходит к методу во второй раз, и именно тогда возникает исключение.
2. Похоже, для включения UPnP нужно было кое-что настроить, поэтому я решил удалить запрос ForwardPort оттуда и поместить его в область обновления хоста и дождаться, пока UPnP будет установлен на доступный, прежде чем я отправлю запрос ForwardPort, и теперь я вижу, что он отображается в таблице upnp portmap нахотя маршрутизатор по-прежнему выдает два исключения, и теперь через минуту или две он выдает «Поток»<Без имени>» (0x149c) завершается с кодом 0 (0x0)».
3. После некоторого изучения это может быть просто поток, созданный Lidgren, который завершил выполнение своей работы. И, может быть, это нормально, что я не могу избавиться от исключений… Я вижу, что порт добавлен в таблицу UPnP portmap, так что, я думаю, это важно. Я проверю еще раз, когда смогу.
4. Я тестировал это с другом, который живет в нескольких часах езды, и он смог подключиться ко мне, поэтому, возможно, будет нормально игнорировать эти исключения, если они хотя бы работают…
Ответ №1:
К сожалению, спецификация протокола UPnP не была должным образом реализована на огромном количестве домашних маршрутизаторов. Результатом этого является то, что все платформы UPnP (даже Intel spec framework) не смогут должным образом взаимодействовать с UPnP с некоторыми локальными маршрутизаторами.
Вы должны обнаружить, что не все маршрутизаторы ваших друзей успешно откроют запрошенные вами порты. Лучшее, что вы можете сделать, это убедиться, что в вашем коде нет сценариев сбоев и неперехваченных исключений, связанных с используемой вами платформой UPnP, и что у вас хорошо задокументировано, как пользователи, у которых не работает UPnP, могут вручную настроить переадресацию портов для вашей игры.
Комментарии:
1. Спасибо за объяснение и совет. Это понятно. Многие игры, похоже, просто оставляют на усмотрение игроков необходимость переадресации порта самостоятельно. Я постараюсь сделать так, как вы предложили, и имейте в виду, что некоторым людям потребуется сделать это вручную.