UDP сокеты создают канал - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! На сервере с белым IP создаю слушающий UDP-сокет:
Socket udp35000 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ClientEP1 = new IPEndPoint(IPAddress.Any, 35000);
udp35000.Bind(ClientEP1);
А так же на сервере в цикле проверяется не пришло ли чего:
            byte[] data = new byte[256];
            int bytes = 0;
            //узнаем адрес, с которого пришли данные
            EndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0);
                while (udp35000.Available > 0)
                {
                    bytes = udp35000.ReceiveFrom(data, ref remoteIp);
                    // получаем данные о подключении
                    IPEndPoint remoteFullIp = remoteIp as IPEndPoint;
                    //отправляем ответку
                    string message = "online_message";
                    byte[] _data = Encoding.ASCII.GetBytes(message);
                    EndPoint remotePoint = new IPEndPoint(remoteFullIp.Address, remoteFullIp.Port);
                    udp35000.SendTo(_data, remotePoint);                    
                }
На клиенте с серым IP за NAT отправляю серверу пакет:
Socket udp35000 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint localIP = new IPEndPoint(IPAddress.Any, 0);
udp35000.Bind(localIP);
string message = "ready_message";
byte[] _data = Encoding.ASCII.GetBytes(message);
EndPoint remotePoint = new IPEndPoint(IPAddress.Parse("хх.хх.хх.хх"), 35000);
udp35000.SendTo(_data, remotePoint);
textBox1.Text = "Отправили сообщение";
На клиенте в цикле так же проверяю входящие пакеты.

Все прекрасно работает, пакеты отправляются и присылаются не смотря на NAT и то, что клиент еще и за роутером.

Но если я немного изменю код на сервере, чтобы ответ на IP и порт клиента шел с другого сокета - ничего не выходит, клиент становится недосягаемым. Вот код:
Socket udp_;
*********************
            byte[] data = new byte[256];
            int bytes = 0;
            //узнаем адрес, с которого пришли данные
            EndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0);
            if (udp35000.Available > 0)
            {
                while (udp35000.Available > 0)
                {
                    bytes = udp35000.ReceiveFrom(data, ref remoteIp);
                    IPEndPoint remoteFullIp = remoteIp as IPEndPoint;
                    string message = "online_message";
                    byte[] _data = Encoding.ASCII.GetBytes(message);
                    EndPoint remotePoint = new IPEndPoint(remoteFullIp.Address, remoteFullIp.Port);
                    if(udp_==null)//этот блок вместо udp35000.SendTo(_data, remotePoint);
                    {
                        udp_ = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                        IPEndPoint localIP = new IPEndPoint(IPAddress.Any, 32121);
                        udp_.Bind(localIP);
                        message = "fcuk_off";
                        _data = Encoding.ASCII.GetBytes(message);
                        udp_.SendTo(_data, remotePoint);
                    }
Получается аналог какого-то канала, клиент за НАТом может пробиться к сокету сервера, сервер с этого самого сокета может отправить ответ, который дойдет до клиента. И если сокет будет другой, т.е. порт отличается - пакет не дойдет. При этом на сокет сервера могут приходить любые пакеты. Как мне исправить код клиента, чтобы до его сокета доходили любые пакеты? Зачем мне все это надо: я хочу чтобы после подключения к серверу, после того как сервер узнает IP и порт клиента №1, клиент №2 мог подключиться к клиенту №1 напрямую. Буду рад любым соображениям на этот счет, т.к. я уже насколько месяцев периодически сталкиваюсь с этой проблемой и никак не могу ее решить.

Решение задачи: «UDP сокеты создают канал»

textual
Листинг программы
IPEndPoint ClientEP1 = new IPEndPoint(IPAddress.Any, 35000);
udp35000.Bind(ClientEP1)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы