udp数据包没有通过

时间:2012-02-29 13:57:26

标签: c# networking network-programming udp

我有以下设置:

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

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

    要求:

    • 通过在路由器上启用端口转发来解决此问题不是一个选项
    • 服务器有固定的IP
    • 有时可以断开客户端与互联网的连接
    • 解决方案必须适用于不同类型的路由器
    • 发送数据包的两个端口&收到的是相同的
    • 所有编程均以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();
            }
        }
    

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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