【发布时间】:2012-03-02 13:17:43
【问题描述】:
我目前正在编写一个允许客户端登录的 UDP 应用程序。之后,他们的端点被存储在一个列表中。
private void socket_Callback(IAsyncResult result_)
{
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
socket.EndReceiveFrom(result_, ref remote);
if (!listOfEndPoints.Contains(remote))
{
// registration process
// add it to list
listOfEndPoints.Add(remote)
}
else
{
// process packet
}
}
但是,有时客户端的 NAT 会为每个数据包分配不同的外部端点。如果注册数据包的源端点是 12.34.56.78:1000,则该端点被添加到列表中。然而,如果同一个客户端发送另一个数据包,NAT 将为其分配一个不同的端口,因此其源端点将是 12.34.56.78:1001。 这导致服务器假设客户端未注册并尝试将数据包作为注册处理。不用说这行不通。
解决此问题的一种方法是向客户端发送一个 ID(不过,如果它不是超级神秘的话,它很容易被伪造)。但是,客户端必须将它添加到它发送到服务器的每个数据包中。 所以那样做不会很有效。
还有其他方法可以判断数据包与注册数据包来自同一个客户端吗?
【问题讨论】: