2009-08-13 11 views
4

Au démarrage, mon programme appelle getifaddrs() pour savoir quelles interfaces réseau sont disponibles pour la multidiffusion IPv6 locale locale. Cela fonctionne aussi loin que possible, mais il ne gère pas le cas où l'ensemble des interfaces réseau disponibles change après le retour de getifaddrs().Existe-t-il un mécanisme de notification pour savoir quand les résultats de getifaddrs() changent?

Le système d'exploitation peut-il notifier mon programme lorsque les interfaces réseau ont changé, pour que je puisse à nouveau appeler getifaddrs() et mettre ma liste à jour? Ou suis-je condamné à interroger getifaddrs() toutes les quelques secondes, pour toujours?

(Remarque: sous Windows, j'appelle GetAdaptersAddresses() au lieu de getifaddrs(), mais le même problème existe là)

+0

Pourquoi vous attendez-vous à ce que les interfaces réseau changent si souvent que vous deviez interroger toutes les quelques secondes? Parlez-vous des interfaces virtuelles? –

+0

Jusqu'à présent, nous avons principalement vu le problème sur MacBooks, où l'utilisateur a notre programme en cours d'exécution et active AirPort, se connecter/déconnecter du réseau local câblé, activer/désactiver HSPA haut débit sans fil, etc. , le programme commence à mal fonctionner car il essaie toujours d'utiliser les interfaces maintenant inactives, et n'essaie pas d'utiliser les interfaces nouvellement actives. –

+0

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

Répondre

1

Vous voulez sans doute avoir un regard sur les fonctions de NotifyAddrChange et NotifyIpInterfaceChange.

2

Si quelqu'un est intéressé, j'ai trouvé le document suivant sur le site de développement d'Apple qui décrit comment être averti lorsque la configuration du réseau change. Ce n'est pas trivial, mais j'ai obtenu la technique pour travailler pour moi. Voir la fiche 8 en particulier.

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

+0

Je pense que le lien ci-dessus est maintenant mort - je l'ai trouvé sur celui-ci http: //developer.apple.com/library/mac/#technotes/tn1145/_index.html – Steg

3

De plus, la façon dont Linux à mettre en œuvre est d'ouvrir une prise de AF_NETLINK familiale et sous-type NETLINK_ROUTE et la lecture des messages qui arrivent sur elle à partir du noyau, comme le montre l'exemple de code inclus dans « l'homme 7 netlink ". (Merci à Rob Searce de m'avoir indiqué cela!)