udp数据包没有通过

我有以下设置:

专用服务器 – >互联网 – >调制解调器(telenet) – >路由器 – >客户端

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

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

要求:

  • 通过在路由器上启用端口转发来解决此问题不是一种选择
  • 服务器有一个固定的IP
  • 客户端有时可能会脱离Internet
  • 解决方案必须适用于不同类型的路由器
  • 发送和接收数据包的两个端口都是相同的
  • 所有编程都在C#中完成
  • 服务器在有更新时通知客户端,客户端可能永远不会轮询服务器以获取更新以防止过载(如果多个客户端同时执行此操作)

Greets 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(); } } 

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

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