Подскажите пожалуйста, есть ли возмлжность передать данные на клиент, который находится под 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();
}
}
Если клиент находится в той же локалке (за тем же роутером), что и сервер, всё ок. А если клиент через интернет (другой компьютер через мобильный роутер), то серверные сообщения не доходят.
Подскажите!
Насколько мне известно, роутер помнит некоторое время "как пробросил" пакеты, т.е. хранит в таблице соответствия адрес внутреннего IP и порт, который был использован для него. Если эта пара более не используется, то через несколько минут она удаляется из этой таблицы.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости