Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Lidgren的UPnP和端口转发失败_C#_Networking_Xna_Portforwarding_Upnp - Fatal编程技术网

C# 使用Lidgren的UPnP和端口转发失败

C# 使用Lidgren的UPnP和端口转发失败,c#,networking,xna,portforwarding,upnp,C#,Networking,Xna,Portforwarding,Upnp,我对网络相当陌生,lidgren让我更容易开始在我的XNA PC游戏中添加多人游戏功能。我一直在网络上测试,把我的笔记本电脑放在我旁边,它工作得很好。问题是我给荷兰的一个朋友发了一份比赛的副本,她无法与我联系。我将它设置为一个人是主机,其他人是连接到该主机的客户端 主机按如下方式设置服务器: Config = new NetPeerConfiguration("game"); Config.Port = 14242; Config.EnableUPnP = true; Config.Ma

我对网络相当陌生,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失败并发出“错误请求”时引发的异常:

以及引发的两个web异常:

在异常详细信息中,它表示连接被远程主机关闭,无法从传输连接读取数据:


关于这里可能发生的事情有什么想法吗?我的路由器上已启用UPnP。我用WireShark查看了网络流量,我可以看到它显示了格式错误的数据包,尽管我没有弄乱任何Lidgren代码,所以我不知道为什么会这样。

不幸的是,UPnP协议规范没有在大量的家庭路由器上正确实现。这样做的结果是,所有UPnP框架(甚至是Intel spec框架)都无法与某些本地路由器正确通信


您会发现并非所有的朋友路由器都能成功打开您请求的端口。您所能做的最好的事情是确保您的代码没有与您正在使用的UPnP框架相关的故障场景和未捕获的异常,并且您有很好的文档记录了UPnP失败的用户如何为您的游戏手动设置端口转发。

我在“internal void ExtractServiceUrl(string resp)”中添加了一个断点它进入并将状态设置为可用,然后第二次进入该方法,这时出现异常。看起来启用UPnP需要设置一些东西,所以我决定从那里取出ForwardPort请求,并将其放在主机的更新区域,等待UPnP设置为可用,然后再发送请求ForwardPort请求,现在我看到它显示在路由器上的upnp portmap表中,尽管它仍然给出了两个异常,现在一两分钟后它给出了“线程”(0x149c)已退出,代码为0(0x0)”。经过一些研究,它可能只是Lidgren创建的一个线程,完成了它的工作。也许我不能排除例外也没关系。。。我看到端口被添加到UPnP端口映射表中,所以我想这才是最重要的。如果可以的话,我会再测试一次。我和一个住在几小时外的朋友测试过,他可以和我联系,所以如果它能工作的话,也许可以忽略这些异常……谢谢你的解释和建议。这是可以理解的。许多比赛似乎只是让球员自己来决定是否需要前锋。我会尽力按照你的建议去做,并记住有些人会被要求手动去做。