udp数据包没有通过

本文关键字:数据包 udp | 更新日期: 2023-09-27 18:26:04

我有以下设置:

专用服务器-->互联网-->调制解调器(电信网)-->路由器-->客户端

  1. 客户端启动与服务器的tcp连接,在服务器上注册自己,并通过以下信息提供:
    • 客户端的mac地址
    • 外部ip;这是通过使用从whatsmyip.org下载的webclient字符串来检索的
  2. 某些更新发生在服务器上,当然需要通知客户端,因此客户端可以自行启动同步会话:
    • 为了通知客户端,服务器将一个udp数据包从服务器发送到调制解调器(发送到外部ip,之前从客户端接收),同时客户端在路由器后面侦听udp数据

问题是我没有收到任何数据包。。我的情况可能吗?我该怎么办

要求:

  • 无法通过在路由器上启用端口转发来解决此问题
  • 服务器有一个固定的ip
  • 客户端有时可以断开与互联网的连接
  • 该解决方案必须适用于不同类型的路由器
  • 发送分组的两个端口&收到的是相同的
  • 所有编程都是用C语言完成的#
  • 当有更新时,服务器会通知客户端,客户端可能永远不会轮询服务器以获取更新,以防止过载(如果多个客户端同时执行此操作)

问候Daan&提前感谢

编辑:
来自服务器的代码示例:

UdpClient udpSender = new UdpClient();
IPEndPoint localServerGateway = new IPEndPoint(IPAddress.Parse(externalIp), 8003);
string message = "testmessage";
byte[] messageBytes = Encoding.ASCII.GetBytes(message);
try
{
     udpSender.Send(messageBytes, messageBytes.Length, localServerGateway);
}
catch (Exception error)
{
     Console.WriteLine("Error while sending message: " + error.ToString());
}
udpSender.Close();

客户端的代码示例:

private void listenForMasterSyncRequest()
{
        bool done = false;
        IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 8003);
        try
        {
            while (!done)
            {
                byte[] bytes = masterSyncUdpListener.Receive(ref groupEP);
                handleMessage(bytes, bytes.Length, true); // handles incoming messages, this is never reached because no packets are received :-(
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("An error occured while listening to server broadcast updates: " + e.ToString());
        }
        finally
        {
            masterSyncUdpListener.Close();
        }
    }

udp数据包没有通过

NAT通过在外部主机和内部主机之间设置会话来工作。但会话必须在内部启动,在您的情况下,这是客户端。因此,它的工作方式是客户端必须轮询服务器,向服务器上的特定端口发送UDP数据包,询问是否需要同步。服务器必须将UDP响应从同一端口发送回客户端发送原始请求的同一端口。如果你这样做,来自服务器的数据包就会通过,否则它们就不会通过。我知道这是有效的,因为这正是DNS查找在NAT后面的工作方式。

由于您无法控制路径中的NAT设备,因此这里唯一明智的方法是使用TCP作为主要传输。