Обнаружение изменения общедоступного IP-адреса в C#

#c# #vpn

Вопрос:

Использование форм и OpenVPN

Я пытаюсь изменить раздел пользовательского интерфейса при подключении пользователя, пока я могу получить исходный IP-адрес, но обновление IP-адреса не меняется.

Я думал, что попытка использовать задачу исправит это, но, увы, этого не произошло, и я в растерянности. Поскольку я действительно не могу найти много информации о такого рода проблемах, хотя, возможно, я искал не в тех местах.

 public static void start() {   Process process = new Process();  ProcessStartInfo startInfo = new ProcessStartInfo();  startInfo.FileName = //redacted;   startInfo.Arguments = // redacted;  //startInfo.WindowStyle = ProcessWindowStyle.Hidden;  //startInfo.CreateNoWindow = true;  process.StartInfo = startInfo;  process.Start();  string orginalip = getipaddress();   Task f = Task.Factory.StartNew(() =gt;  {  while (stopupdating == false)  {  string updatingip = getipaddressloop();   if (orginalip == updatingip)  {  //MessageBox.Show("Connecting...");  MessageBox.Show(orginalip   updatingip);  }  if (orginalip != updatingip)  {  stopupdating = true;  MessageBox.Show("Connected UDP");  }  }  }); }  static string getipaddressloop() {  while (stopupdating == false)  {  string address = new WebClient().DownloadString("https://ipv4.icanhazip.com/");  return address;  }  string lastaddress = new WebClient().DownloadString("https://ipv4.icanhazip.com/");  return lastaddress; }  static string getipaddress() {  string address = new WebClient().DownloadString("https://ipv4.icanhazip.com/");  return address; }  

Комментарии:

1. Просто чтобы уточнить, поскольку неясно, ваше приложение является клиентской стороной, и вы используете UDP для подключения к серверу? Вы не можете использовать внешний IP-адрес, так как даже динамический IP-адрес часто назначается провайдером на минимальный срок, намного превышающий срок его использования. Похоже, вы используете UDP, который не реализует автоматические ответы, поэтому вам нужно будет отправить пакет, который активно запускает сервер для отправки ответа, а затем инициирует тайм-аут отключения, если ответ не получен в течение установленного периода времени.

Ответ №1:

Похоже, вам нужно что-то вроде следующего:

 WebClient _client = new WebClient();  public static async void CheckForIpChange() {  orginalip = getipaddressloop();  while (true)  {  await Task.Delay(5000);  string updatingip = getipaddressloop();   if (orginalip == updatingip)  MessageBox.Show("No Change");  else  break;  });  MessageBox.Show("New IP "   updatingip); }  static string getipaddressloop() {  return _client.DownloadString("https://ipv4.icanhazip.com/"); }  

Комментарии:

1. Спасибо за ответ, я смог заставить это работать после некоторых изменений и, возможно, нашел причину проблемы. Когда цикл пытается снова загрузить строку через getipaddressloop (), она не «обновляется» и всегда дает одно и то же значение, я смог заставить ее работать, используя два разных веб-сайта и проверяя только через 30 секунд, зная, что к тому времени я буду подключен