Передача данных по udp на клиент под NAT (C# winforms)

146
22 июля 2019, 23:10

Подскажите пожалуйста, есть ли возмлжность передать данные на клиент, который находится под NAT.

Поясню задачу, есть сервер с внешним IP. Есть клиент под NAT, но с включённым UPNP. Но БЕЗ настроек проброса портов. Это не широковещание. Это только 1 клиент и только 1 сервер. Задача, передать на клиент данные (и делать это постояно , тоесть в While(true) {передача}) по UDP.

Подскажите пожалуйста, куда двигаться.

UPDATE////////////////////

По совету товарищей ниже сделал так: Клиент (за натом) отправляет каждые 5 секунд текст "ПоддержкаСоединения" на сервер (статичный внешний IP за роутером с пробросом портов). Сервер в ответ на это сообщение высылает свои данные. Серверный код:

private void ListenConnectionSupport(ref string itValue, CancellationToken cancelToken)
        {
            IPEndPoint IpEp = new IPEndPoint(IPAddress.Any, 13001);
            UdpClient listenClient = new UdpClient(IpEp);
            try
            {
                while (true)
                {
                    cancelToken.ThrowIfCancellationRequested();
                    IPEndPoint cIpEp=null;
                    byte[] messageBytes = listenClient.Receive(ref cIpEp);
                    if (Encoding.UTF8.GetString(messageBytes) == "UDP-support")
                    {
                        itValue = String.Format("{0}:{1}",cIpEp.Address,cIpEp.Port);
                    }
                }
            }
            catch (OperationCanceledException ex)
            { }
            finally
            {
                if (listenClient != null)
                    listenClient.Close();
            }
        }
private void SendData(ref Bitmap kadr, ref string kuda, CancellationToken cancelToken)
        {
            UdpClient senderClient = new UdpClient();// (ClientEP);
            try
            {
                while (true)
                {
                    cancelToken.ThrowIfCancellationRequested();
                    if (string.IsNullOrEmpty(kuda))
                        continue;
                    byte[] testMessage = Encoding.UTF8.GetBytes(kadr.ToString());
                    string ip = kuda.Split(':')[0];
                    string p = kuda.Split(':')[1];
                    IPEndPoint clientEP = new IPEndPoint(IPAddress.Parse(ip), int.Parse(p));
                    senderClient.Send(testMessage, testMessage.Length, clientEP);
                    Thread.Sleep(3000);
                }
            }
            catch (OperationCanceledException ex)
            { }
            finally
            {
                if (senderClient != null)
                    senderClient.Close();
            }
        }

Если клиент находится в той же локалке (за тем же роутером), что и сервер, всё ок. А если клиент через интернет (другой компьютер через мобильный роутер), то серверные сообщения не доходят.

Подскажите!

Answer 1

Насколько мне известно, роутер помнит некоторое время "как пробросил" пакеты, т.е. хранит в таблице соответствия адрес внутреннего IP и порт, который был использован для него. Если эта пара более не используется, то через несколько минут она удаляется из этой таблицы.

READ ALSO
Что значит в generic where T : unmanaged?

Что значит в generic where T : unmanaged?

Сидел пробовал написать Generic метод для получения значения типа из указателя, и вот случайно написал where T : unmanaged и этот код был успешно откомпилирован!

175
iOS и Windows читают .xml файлы по-разному C#

iOS и Windows читают .xml файлы по-разному C#

Есть проект XamarinForms, внутри есть три приложения (iOS, Android, UWP), один общий проект с общим кодом Portable Class Library

196
Поиск в txt файле

Поиск в txt файле

Имеетсяtxt файл, в котором записан текст

153
PHPUnit. Как глобально замокать метод класса?

PHPUnit. Как глобально замокать метод класса?

Имеется два классаВ классе Two создаем экземпляр класса One в переменную $one

180