В настоящее время я программирую приложение 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.Это приводит к тому, что сервер предполагает, что клиент не зарегистрирован, и пытается обработать пакет как регистрационный.Излишне говорить, что это не сработает.
Способ исправить это - отправить клиенту идентификатор (который, однако, может быть легко подделан, если он не супершифрованный)Однако клиент должен будет добавить его к каждому пакету, который он отправляет на сервер.Так что было бы не очень эффективно делать это таким образом.
Есть ли другой способ сообщить, что пакет поступил от того же клиента, что и пакет регистрации?