UDP-вещание с помощью сокетов Indy: как правильно выбрать интерфейс?

Использование C++Builder2006

Я модифицирую старую маленькую программу, которая выполняет следующие действия:

  1. отправить широковещательное сообщение UDP (используя адрес 255.255.255.255)
  2. получить ответ от всех подключенных устройств (аппаратные средства, оснащенные RabbitCore RCM3200)
  3. При желании можно передать другое UDP-сообщение, содержащее MAC-адрес одного из них и правильную конфигурацию сети, которую это устройство должно установить для себя.

(Это потому, что устройство может иметь неправильную IP/ сетевую маску при установке и существует необходимость в методе, независимом от IP, чтобы установить его. Это хорошо известный метод от производителя устройства, поэтому его нельзя изменить, я просто описывая, что я делаю).

Проблема, с которой я сталкиваюсь, хорошо описана здесь: короче говоря, Win7 не отправляет UDP-сообщение через все интерфейсы, а только через "предпочтительный". Так как программа была построена с использованием сокета Indy UDPClient (TIdUDPClient), я бы хотел оставить все как есть.

Вопросы:

  1. Есть ли способ "заставить" сокет UDP отправлять через определенный сетевой интерфейс? Таким образом, я мог бы "вручную" зациклить и отправить трансляцию во все (соответствующие) сети
  2. Если нет.... что я должен сделать, чтобы получить тот же результат?

1 ответ

Решение

Есть ли способ "заставить" сокет UDP отправлять через определенный сетевой интерфейс?

TIdUDPClient имеет BoundIP собственность для этой конкретной цели. Вам придется позвонить TIdUDPClient.Binding.CloseSocket() каждый раз, когда вы хотите изменить BoundIP, если вы не связываете другое TIdUDPClient объект для каждого адаптера.

Таким образом, я мог бы "вручную" зациклить и отправить трансляцию во все (соответствующие) сети

В зависимости от версии Indy, которую вы используете, вы можете использовать TIdStack.LocalAddresses собственность, или TIdStack.AddLocalAddressesToList() или же TIdStack.GetLocalAddressList() метод, чтобы получить список доступных локальных IP-адресов, которые вы можете затем перебрать.

Другие вопросы по тегам