Как заставить UdpClient реагировать на обновления DNS - PullRequest
0 голосов
/ 28 апреля 2009

Я использую UdpClient для отправки пакетов на сервер. Я инициализирую UdpClient при создании моего объекта Sender, используя конструктор (имя хоста, порт). Созданный таким образом, UdpClient разрешает имя хоста в IP-адрес. Последующие вызовы объекта UdpClient используют IP-адрес.

К сожалению, если используемый псевдоним DNS обновляется через систему DNS, чтобы указывать на другой IP-адрес, это изменение не отражается в моем объекте отправителя, пока он не будет создан заново.

Как лучше всего, чтобы мой объект Sender своевременно реагировал на изменения DNS? Производительность очень важна. Я могу придумать несколько решений:

  1. Выполнение разрешения DNS для каждого вызова (т. Е. С использованием перегрузки Send, которая принимает параметр имени хоста). Это может быть довольно быстро из-за кеша DNS в Windows, я не знаю.
  2. Наличие какого-либо средства проверки DNS, запущенного в потоке таймера, для периодической проверки, разрешает ли псевдоним DNS другой IP-адрес. Если это произойдет, он каким-то образом обновит UdpClient для использования нового IP-адреса. Однако я не хочу блокировать объект UdpClient при каждом вызове - как я уже говорил, производительность важна.

У кого-нибудь есть опыт в этом деле?

1 Ответ

2 голосов
/ 28 апреля 2009

Я бы отделил разрешение адреса от UdpClient.

  1. Использование Dns класса для разрешения IPaddress (и сохранение в локальной переменной)
  2. Используйте конструктор без параметров UdpClient,
  3. Не подключаться UdpClient
  4. Используйте явный Send с параметром IPEndPoint.

В фоновом потоке:

  1. проверять каждые X секунд на наличие обновленного DNS
  2. замените локальную переменную IPEndPoint, передаваемую на ваш UdpClient.Send вызов.

Нет необходимости каждый раз уничтожать UdpClient. Также нет необходимости блокировать при обновлении IPEndPoint. В худшем случае у вас есть одна грязная отправка на старый адрес, но, поскольку вы не будете сразу получать уведомления об обновлениях, вы все равно будете иметь грязную отправку.

...