Server 如何使用专用ip向客户端发送数据包?

Server 如何使用专用ip向客户端发送数据包?,server,udp,client,nat,packets,Server,Udp,Client,Nat,Packets,我用c#制作客户端和服务器,并希望在这两个应用程序之间发送数据包。当客户端向服务器发送消息时,一切正常,服务器接受它。但当服务器尝试回复时,客户端不会收到消息。我认为,这是一个问题,因为我有私有ip(我不确定,但我认为它是NAT-1IP和许多计算机),我的服务器运行在我的VPS上。 那么,如何从服务器回复客户机呢 客户端代码: void SendDataToServer(string Message) { IPAddress Ip = Dns.GetHostEnt

我用c#制作客户端和服务器,并希望在这两个应用程序之间发送数据包。当客户端向服务器发送消息时,一切正常,服务器接受它。但当服务器尝试回复时,客户端不会收到消息。我认为,这是一个问题,因为我有私有ip(我不确定,但我认为它是NAT-1IP和许多计算机),我的服务器运行在我的VPS上。 那么,如何从服务器回复客户机呢

客户端代码:

    void SendDataToServer(string Message)
    {
        IPAddress Ip = Dns.GetHostEntry("mydomain.com").AddressList[0];
        int Port = 1234;
        IPEndPoint Server = new IPEndPoint(Ip, Port);

        byte[] MessageInBytes = Encoding.UTF8.GetBytes(Message);
        MySocket.SendTo(MessageInBytes, Server);
    }

    void ReceiveDataFromServer(int Port) // this is running in background
    {
        UdpClient Client = new UdpClient(Port);
        IPEndPoint Server = new IPEndPoint(IPAddress.Any, Port);
        try
        {
            while (true)
            {
                byte[] MessageInBytes = Client.Receive(ref Server);
                string Message = Encoding.UTF8.GetString(MessageInBytes, 0, MessageInBytes.Length);
                MessageBox.Show(Message);
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e);
        }
    }
服务器代码:

    static void StartReceiveing(int Port) // this is running in background
    {
        UdpClient Server = new UdpClient(Port);
        IPEndPoint Client = new IPEndPoint(IPAddress.Any, Port);

        try
        {
            while (true)
            {
                byte[] MessageInBytes = Server.Receive(ref Client);
                string Message = Encoding.UTF8.GetString(MessageInBytes, 0, MessageInBytes.Length);
                Console.WriteLine("Received message: " + Message);
                Task.Run(() => ReplyToClient("some text", Client));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    static void ReplyToClient(string Message, IPEndPoint Client)
    {
        try
        {
            byte[] MessageInBytes = Encoding.UTF8.GetBytes(Message);
            NetClient.SendTo(MessageInBytes, Client);

            Console.WriteLine("Sending reply: " + Message);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

在您的服务器代码中,什么是“NetClient”?您应该使用
服务器
变量发送回复,因此回复将从上接收数据包的同一端口发送,这将确保数据包返回到NAT后面的客户端。抱歉,我忘记了这一点。Socket NetClient=新套接字(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);MySocket是一样的。但是,如果我将应答发送到同一端口,我必须更改Client上的侦听端口吗?或者没有?好的,正如前面提到的,您不应该使用它来发送回复,使用您现有的
UdpClient服务器=新的UdpClient(端口)发送回复。仍不工作。我更改此行:Server.Send(MessageInBytes,MessageInBytes.Length,Client);我认为这是客户端的问题,因为在更改此行之前和之后,我在控制台中有日志:received from:xxx.xxx.xxx:abcde和消息:Send reply to:xxx.xxx.xxx:abcde。所以,我认为它发送到正确的端口,但我的客户不接受它?也许我必须改变客户端的监听端口或者别的什么?但几乎所有消息都来自其他端口。