UPnP和Lidgren端口转发失败

3
我对网络技术比较新,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”:

enter image description here

还有两个 web 异常被抛出:

enter image description here enter image description here

在异常详细信息中,它说有关连接被远程主机关闭且无法从传输连接读取数据的内容:

enter image description here

您对此有什么想法吗?我的路由器上启用了 UPnP。我使用 WireShark 查看了网络流量,发现它显示了格式不正确的数据包,但我没有更改任何 Lidgren 代码,所以不确定为什么会这样。


我在“internal void ExtractServiceUrl(string resp)”中添加了一个断点。它到达并将状态设置为Available,然后再次进入该方法时发生异常。 - Ted
看起来启用UPnP需要设置一些东西,所以我决定从那里取出ForwardPort请求并将其放入主机的更新区域,并等待UPnP可用后再发送ForwardPort请求,现在我看到它出现在路由器的upnp端口映射表中,虽然它仍然会给出两个异常,但是现在过了一两分钟后,它会显示“线程'<No Name>'(0x149c)已退出,代码为0(0x0)”。 - Ted
经过一些调查,可能只是由Lidgren创建的线程完成了它的工作。也许我无法摆脱异常也没关系...我看到端口已添加到UPnP端口映射表中,所以这很重要。我会在有机会时再次测试。 - Ted
我和一个住在几个小时之外的朋友进行了测试,他能够连接到我,所以如果至少能正常工作,也许可以忽略那些异常情况... - Ted
1个回答

3
抱歉,我只能回答英文问题。以下是您需要翻译的内容:

不幸的是,许多家用路由器上并没有正确实现UPnP协议规范。这样做的结果是,所有UPnP框架(即使是英特尔规范框架)将无法与某些本地路由器正确通信。

您会发现,并非所有朋友的路由器都能成功打开您请求的端口。你所能做的最好的就是确保你的代码没有任何与你使用的UPnP框架相关的失败场景和未捕获的异常,并且你已经很好地记录下了那些无法使用UPnP的用户如何手动设置端口转发来玩游戏的方法。


感谢您的解释和建议。这很容易理解。许多游戏似乎只是让玩家自己转发端口。我会尝试按照您的建议去做,并记住有些人需要手动操作。 - Ted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接