NAT上的UDP(通过Internet)

时间:2019-02-11 19:31:39

标签: c# udp nat

我正在用服务器(带UDP端口转发的NAT之后,静态白色IP)和客户端(无任何自定义设置的NAT后面)对系统进行编码。

任务是通过Internet将数据从服务器发送到客户端。 为了让Server知道客户端的端点(并且客户端的路由器保留转换表),Client每隔5秒向Server发送一次简单的UDP请求,例如“ Hello!”。 服务器代码:

    private void SendData(ref string destination, CancellationToken cancelToken)
    {
        UdpClient senderClient = new UdpClient(AddressFamily.InterNetwork);
        try
        {
            while (true)
            {
                cancelToken.ThrowIfCancellationRequested();
                if (string.IsNullOrEmpty(destination))
                    continue;
                byte[] testMessage = Encoding.UTF8.GetBytes("AnyDatas");

                string ip = destination.Split(':')[0];
                string p = destination.Split(':')[1];
                IPEndPoint clientEP = new IPEndPoint(IPAddress.Parse(ip), int.Parse(p));
                senderClient.Send(testMessage, testMessage.Length, clientEP);
                Thread.Sleep(3000);
            }
        }
        catch (OperationCanceledException ex)
        { }
        finally
        {
            if (senderClient != null)
                senderClient.Close();
        }
    }

    private void ListenConnectionSupport(ref string stClientEP, CancellationToken cancelToken)
    {
        IPEndPoint IpEp = new IPEndPoint(IPAddress.Any, 13001);
        UdpClient listenClient = new UdpClient(IpEp);
        try
        {
            while (true)
            {
                cancelToken.ThrowIfCancellationRequested();
                IPEndPoint cIpEp=null;
                byte[] messageBytes = listenClient.Receive(ref cIpEp);
                if (Encoding.UTF8.GetString(messageBytes) == "UDP-support")
                {
                    stClientEP = String.Format("{0}:{1}",cIpEp.Address,cIpEp.Port);
                }
            }
        }
        catch (OperationCanceledException ex)
        { }
        finally
        {
            if (listenClient != null)
                listenClient.Close();
        }

    }

那甚至行得通! 但是,即使客户端在同一路由器下,尽管向外部服务器IP发送了client-> server请求。

我将智能手机用作客户端的路由器,然后重试(客户端是另一台PC)。但是,尽管服务器获取Hello请求并发送答案,但是客户端却什么也没有。

UPDATE -----------------

我需要开发计划系统: 服务器(192.168.0.3)-路由器A(静态公共IP,具有服务器的端口转发)-互联网-路由器B(任何常规热点或路由器)-客户端

算法:

  1. 客户端发送到routerA(在这种情况下,routerA = Server)“您好,请给我您的数据。”对于路由器表,客户端会连续发送此消息。

  2. 上一条消息中的服务器(例如STUN服务器)可以记录客户端EP。

  3. 处于WHILE(true)周期的服务器将数据发送到客户端。

错误是“客户端无法从服务器获取数据”。

这很重要

  • 服务器监听13001端口,客户端知道该端口号

  • 在“一个路由器”情况下,服务器看到客户端的端点,例如“ 192.168.0.5”(他的本地IP);在“两个路由器”的情况下,客户端的端点看起来像未知的IP(我不知道那是什么,他的ipconfig显示了另一个)。

请告诉我正确的方向!

0 个答案:

没有答案