UDP穿孔帮助
本文关键字:帮助 穿孔 UDP | 更新日期: 2023-09-27 18:03:17
我正在尝试通过互联网将网络添加到我的游戏中,使用点对点。我已经实现了一个局域网版本,它使用。net的点对点类来连接本地网络。
我意识到我需要使用UDP打孔,以便与防火墙后面的其他客户端建立连接。
这是我如何开始实现它:该服务器是一个HTTP服务器,使用非常简单的PHP脚本来完成工作。
-
- 在服务器上注册名称,发送私有ip地址和端口作为GET变量
- 当服务器收到注册请求时,它将保存公共端点和私有端点
-
- 请求连接另一个客户端。
- 服务器将返回客户端的私有和公共端点
- 每两秒钟,第二个客户端将与服务器签入,如果有另一个客户端试图与它连接,它也将获得它的端点
-
- 两个客户端开始向彼此的公共端点发送垃圾邮件,直到它们得到一个有效的响应
现在我有一堆问题
- 服务器可以是HTTP服务器吗?
- 当我向HTTP服务器发出请求时,每次发出请求时客户端端口都会更改。私有端点是否总是与相同的公共端点匹配?
- 对服务器的请求必须具有与向客户端的UDP消息相同的源端点吗?
- 是否有一种方法可以使用指定的源端点连接到c#中的HTTP服务器?
- 我的执行有什么问题吗?
谢谢!
UDP穿孔是一个复杂的主题,已经进行了许多尝试来找到一个有效的解决方案。问题是有这么多不同的NAT路由器,并且没有实现NAT的标准方法,所以所有路由器的行为都有点不同。
一些尝试已经标准化,例如STUN, ICE。它们仍然只在大多数情况下有效,而不是全部,但它们积累了大量的知识并解决了许多问题——比您的尝试所能做到的要多,因为您无法在太阳下的每个NAT路由器上测试您的解决方案。例如,Skype花了数年时间完善其NAT穿越机制。
我建议你看一下STUN或者最好是ICE。尝试实现其中一个或查找现有的实现。
另一个选择可能是简单地在路由器上创建一个端口转发,例如使用UPnP或NAT-PMP。
也就是说,如果。net对等类带有NAT遍历机制,我不会感到惊讶,但我对它们并不熟悉。
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地址进行连接。您可以通过在命令提示符中编写一些命令从"Teredo"服务器获取Ipv6全局地址。实际上,IPV6是用来避免这个问题的技术。