Как отправить пакет клиенту с приватным ip? - PullRequest
0 голосов
/ 27 июня 2018

Я делаю клиент и сервер в c #, и я хочу отправлять пакеты между этими 2 приложениями. Когда клиент отправляет сообщение на сервер, все хорошо, сервер принимает его. Но когда сервер пытается ответить, клиент не получает сообщение. Я думаю, это проблема, потому что у меня есть частный IP (я не уверен, но я думаю, что это NAT - 1 IP и много компьютеров), и мой сервер работает на моем 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);
        }
    }
...