2009-08-13 5 views
4

При запуске моя программа вызывает getifaddrs(), чтобы узнать, какие сетевые интерфейсы доступны для многоадресной рассылки local-local IPv6. Это работает, насколько это возможно, но не обрабатывает случай, когда набор доступных сетевых интерфейсов изменяется после возврата getifaddrs().Есть ли механизм уведомления, когда результаты getifaddrs() меняются?

Есть ли способ для ОС уведомлять мою программу, когда сетевые интерфейсы изменились, поэтому я могу снова вызвать getifaddrs() и обновить список? Или я обречен на опрос getifaddrs() каждые несколько секунд, навсегда?

(Примечание: на Windows, я называю GetAdaptersAddresses() вместо getifaddrs(), но та же проблема существует там)

+0

Почему вы ожидаете, что сетевые интерфейсы будут так часто меняться, что вам придется опросить каждые несколько секунд? Вы говорите об виртуальных интерфейсах? –

+0

До сих пор мы в основном видели проблему на MacBooks, где у пользователя есть наша программа и включается и выключается AirPort, подключается/отключается от проводной локальной сети, включает/отключает высокоскоростную беспроводную связь HSPA и т. Д. Когда это происходит , программа начинает работать с ошибкой, так как она все еще пытается использовать неактивные интерфейсы и не пытается использовать новые активные. –

+0

Dupe: http://stackoverflow.com/questions/579783/how-to-detect-ip-address-change-programmatically-in-linux –

ответ

1

Вы, вероятно, хотите, чтобы взглянуть на NotifyAddrChange и NotifyIpInterfaceChange функций.

2

В случае, если кому-то интересно, на веб-сайте разработчика Apple был найден следующий документ, в котором описывается, как получать уведомления при изменении конфигурации сети. Это нетривиально, но я получил технику для работы для меня. См. Листинг 8 в частности.

Technical Note TN1145 - Living in a Dynamic TCP/IP Environment"

+0

Я думаю, что вышеупомянутая ссылка сейчас мертва - я нашел ее на этом http: //developer.apple.com/library/mac/#technotes/tn1145/_index.html – Steg

3

Кроме того, как Linux реализовать это, открыв гнездо семьи AF_NETLINK и подтипа NETLINK_ROUTE и читать сообщения, поступающие на него из ядра, как показано в примере кода, включенного в «человека 7 netlink ". (Спасибо Rob Searce за то, что указали мне на это!)