UDP сокеты создают канал - C#
Формулировка задачи:
Добрый день!
На сервере с белым IP создаю слушающий UDP-сокет:
А так же на сервере в цикле проверяется не пришло ли чего:
На клиенте с серым IP за NAT отправляю серверу пакет:
На клиенте в цикле так же проверяю входящие пакеты.
Получается аналог какого-то канала, клиент за НАТом может пробиться к сокету сервера, сервер с этого самого сокета может отправить ответ, который дойдет до клиента. И если сокет будет другой, т.е. порт отличается - пакет не дойдет.
При этом на сокет сервера могут приходить любые пакеты.
Как мне исправить код клиента, чтобы до его сокета доходили любые пакеты?
Зачем мне все это надо: я хочу чтобы после подключения к серверу, после того как сервер узнает IP и порт клиента №1, клиент №2 мог подключиться к клиенту №1 напрямую.
Буду рад любым соображениям на этот счет, т.к. я уже насколько месяцев периодически сталкиваюсь с этой проблемой и никак не могу ее решить.
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); }
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); }
Решение задачи: «UDP сокеты создают канал»
textual
Листинг программы
IPEndPoint ClientEP1 = new IPEndPoint(IPAddress.Any, 35000); udp35000.Bind(ClientEP1)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д