我正在尝试通过互联网将网络添加到我的游戏中,使用Peer to Peer。 我已经实现了一个仅限LAN的版本,它使用.NET的对等类来连接本地网络。
我意识到我需要使用UDP打孔来建立与防火墙后面的其他客户端的连接。
这就是我开始实现它的方式: 服务器是一个HTTP服务器,它使用非常简单的PHP脚本来完成工作。
现在我有一堆问题
谢谢!
答案 0 :(得分:3)
UDP穿孔是一个复杂的主题,并且已经进行了许多尝试以找到有效的解决方案。问题是那里有很多不同的NAT路由器,并没有实现NAT的标准方法,所以所有路由器的行为都有点不同。
一些尝试已经标准化,例如STUN,ICE。它们仍然只在大多数情况下工作,而不是全部,但是它们积累了大量的知识并解决了许多问题 - 比你的尝试更多,仅仅是因为你无法在阳光下使用每个NAT路由器测试你的解决方案。例如,Skype花了数年时间来完善其NAT遍历机制。
我建议您查看 STUN 或最好是 ICE 。尝试实现其中之一或寻找现有的实现。
另一种选择可能是简单地在路由器上创建一个前向端口,例如使用 UPnP 或 NAT-PMP 。
也就是说,如果.NET对等类带有NAT遍历机制,我不会感到惊讶,但我对它们并不熟悉。
答案 1 :(得分:0)
STUN是解决问题的最佳方案。它适用于大多数场景。有一个简单的例子(C#)为您提供NAT类型,本地IP:端口和公共IP:端口。
try
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(new IPEndPoint(IPAddress.Any, 0));
STUN_Result result = STUN_Client.Query("stunserver.org", 3478, socket);
Console.WriteLine("Net Type : " + result.NetType.ToString());
Console.WriteLine("Local IP : " + socket.LocalEndPoint.ToString());
if (result.NetType != STUN_NetType.UdpBlocked)
{
Console.WriteLine("Public IP : " + result.PublicEndPoint.ToString());
}
else
{
Console.WriteLine("");
}
}
catch (Exception x)
{
Console.WriteLine(x.StackTrace.ToString());
}
您可以添加一些断点并检查代码的行为。
您也可以使用vs2010 onwords(.net4.0<)遍历NAT。有一个方法AllowNATTraversal(bool值)。为NAT Traverse设置值true。它使用Ipv6地址进行连接。您可以从#34; Teredo"获得Ipv6全球地址。服务器通过在命令提示符下编写一些命令实际上,IPV6是用于避免此问题的技术。