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)