UPnP и переадресация портов с Lidgren не удается
Я довольно плохо знаком с сетевыми технологиями, и Лидгрен значительно облегчил мне задачу добавления многопользовательских возможностей в мою игру для XNA PC. Я тестировал по сети, настраивая свой ноутбук рядом со мной, и он работал отлично. Проблема в том, что я отправил копию своей игры другу в Нидерландах, и она не может связаться со мной. Я настроил его так, чтобы один человек был хостом, а другие - клиентами, которые подключаются к этому хосту.
Хост настраивает сервер следующим образом:
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 выбрасывает при сбое и выдает "Bad Request":
И два веб-исключения, которые выбрасываются:
Это говорит о том, что соединение закрыто удаленным хостом и не может прочитать данные из транспортного соединения в деталях исключения:
Есть мысли о том, что здесь может происходить? UPnP включен на моем маршрутизаторе. Я посмотрел на сетевой трафик с помощью WireShark и вижу, что он отображает искаженные пакеты, хотя я не связывался ни с одним из кодов Лидгрена, поэтому я не уверен, почему это так.
1 ответ
К сожалению, спецификация протокола UPnP не была должным образом реализована на огромном количестве домашних маршрутизаторов. Результатом этого является то, что все платформы UPnP (даже инфраструктура спецификаций Intel) не смогут должным образом связывать UPnP с некоторыми локальными маршрутизаторами.
Вы должны обнаружить, что не все маршрутизаторы ваших друзей успешно открывают запрашиваемые вами порты. Лучшее, что вы можете сделать, - это убедиться, что в вашем коде нет сценариев сбоев и неперехваченных исключений, связанных с используемой платформой UPnP, и что вы хорошо документировали, как пользователи, отказавшие в UPnP, могут вручную настроить переадресацию портов для вашей игры.