2009-08-13 2 views
4

Beim Start ruft mein Programm gettifaddrs() auf, um herauszufinden, welche Netzwerkschnittstellen für das link-lokale IPv6-Multicasting verfügbar sind. Dies funktioniert so weit wie es geht, aber es behandelt nicht den Fall, bei dem sich die Menge der verfügbaren Netzwerkschnittstellen ändert, nachdem getifaddrs() zurückgegeben wurde.Gibt es einen Benachrichtigungsmechanismus, wenn sich die Ergebnisse von getifaddrs() ändern?

Gibt es eine Möglichkeit für das Betriebssystem, mein Programm zu benachrichtigen, wenn sich die Netzwerkschnittstellen geändert haben, damit ich gettifaddrs() erneut aufrufen und meine Liste aktualisieren kann? Oder bin ich dazu verurteilt, alle paar Sekunden (für immer) Getifaddrs() abzufragen?

(Hinweis: unter Windows, ich nenne GetAdaptersAddresses() anstelle von getifaddrs(), aber das gleiche Problem existiert)

+0

Warum sollten Sie erwarten, dass sich die Netzwerkschnittstellen so oft ändern, dass Sie alle paar Sekunden eine Abfrage durchführen müssen? Sprechen Sie über virtuelle Schnittstellen? –

+0

Bis jetzt haben wir das Problem hauptsächlich auf MacBooks gesehen, wo der Benutzer unser Programm läuft und AirPort ein- und ausschaltet, sich mit dem kabelgebundenen LAN verbindet/trennt, HSPA Highspeed-WLAN aktiviert/deaktiviert usw. Wenn dies geschieht , das Programm startet eine Fehlfunktion, da es immer noch versucht, die jetzt inaktiven Schnittstellen zu verwenden und nicht versucht, die neu aktiven zu verwenden. –

+0

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

Antwort

1

Sie wahrscheinlich einen Blick auf die NotifyAddrChange und NotifyIpInterfaceChange Funktionen haben wollen.

2

Falls jemand interessiert ist, habe ich das folgende Dokument auf Apples Entwicklerwebsite gefunden, das beschreibt, wie man benachrichtigt wird, wenn sich die Netzwerkkonfiguration ändert. Es ist nicht trivial, aber ich habe die Technik bekommen, um für mich zu arbeiten. Siehe insbesondere Listing 8.

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

+0

Ich denke, der obige Link ist jetzt tot - ich habe es auf diesem einen http gefunden: //developer.apple.com/library/mac/#technotes/tn1145/_index.html – Steg

3

Auch der Linux-Weg, dies zu implementieren ist durch eine Fassung der Familie AF_NETLINK und Subtyp NETLINK_ROUTE Öffnen und Lesen der Nachrichten, die auf sie aus dem Kernel ankommen, wie in „Mann im Beispielcode enthielt gezeigt 7 netlink ". (Danke an Rob Searce, der mich darauf hingewiesen hat!)

Verwandte Themen