Frage

Betrachten Sie die folgende Konfiguration:Ein Windows-PC mit einer LAN-Schnittstelle und einer WiFi-Schnittstelle (der Standard für jeden neuen Laptop).Jede der Schnittstellen kann mit einem Netzwerk verbunden oder davon getrennt sein.Ich brauche eine Möglichkeit, festzustellen, welcher der Adapter mit dem Internet verbunden ist – insbesondere für den Fall, dass beide mit unterschiedlichen Netzwerken verbunden sind, einer mit und einer ohne Internetverbindung.

Meine aktuelle Lösung beinhaltet die Verwendung von IPHelpers „GetBestInterface"-Funktion und versorgt sie mit der IP-Adresse „0.0.0.0".

Haben Sie weitere Lösungsvorschläge für dieses Problem?

Lassen Sie mich im Anschluss an einige der Antworten näher darauf eingehen:

  • Ich brauche das, weil ich ein Produkt habe, das auswählen muss, an welchen Adapter es gebunden werden soll.Ich habe keine Möglichkeit, die Einrichtung des Netzwerks oder des Hosts zu kontrollieren, auf dem das Produkt ausgeführt wird, und benötige daher eine möglichst robuste Lösung mit möglichst wenigen Annahmen.
  • Ich muss dies im Code tun, da dies Teil eines Produkts ist.

@Chris Upchurch:Dadurch bin ich darauf angewiesen, dass google.com aktiv ist (was normalerweise kein Problem darstellt) und dass eine persönliche Firewall installiert ist, um Ping zu ermöglichen.

@Bis:Wie Steve Moon sagte, ist es ziemlich riskant, sich auf die Adresse des Adapters zu verlassen, da man viele Annahmen über die interne Netzwerkeinrichtung trifft.

@Steve Moon:Ein Blick auf die Routing-Tabelle klingt nach einer guten Idee, aber anstatt die Routing-Logik selbst anzuwenden, versuche ich, wie oben beschrieben „GetBestInterface“ zu verwenden.Ich glaube, dass es genau das tun soll, was Sie in Ihrer Antwort beschrieben haben, aber ich bin mir nicht wirklich sicher.Der Grund, warum ich zögere, meine eigene „Routing-Logik“ zu implementieren, liegt darin, dass die Wahrscheinlichkeit größer ist, dass ich etwas falsch mache, als wenn ich eine Bibliothek/API verwende, die von „härteren“ Netzwerkleuten geschrieben und getestet wurde.

War es hilfreich?

Lösung

Technisch gesehen gibt es keine „Verbindung zum Internet“.Die eigentliche Frage ist, welche Schnittstelle an eine gewünschte Adresse weitergeleitet werden kann.Im Moment fragen Sie nach der „Standardroute“ – der Route, die gilt, wenn keine bestimmte Route zum Ziel vorhanden ist.Sie ignorieren jedoch bestimmte Routen.

Glücklicherweise reicht das für 99,9 % der Heimanwender aus.Sie verfügen wahrscheinlich nicht über eine große Routing-Tabelle, und GetBestInterface bevorzugt automatisch die kabelgebundene gegenüber der kabellosen Lösung – Sie sollten also gut sein.Fügen Sie eine Überschreibungsoption für die 0,1 % der Fälle hinzu, die Sie vermasseln, und machen Sie Schluss.

Für den Unternehmensgebrauch sollten Sie GetBestInterface jedoch für ein bestimmtes Ziel verwenden. Andernfalls treten Probleme auf, wenn sich jemand im selben LAN wie Ihr Ziel befindet (was bedeutet, dass Sie die „interne“ Schnittstelle und nicht die „externe“ Schnittstelle verwenden sollten). ) oder eine bestimmte Route zu Ihrem Ziel hat (mein internes Netzwerk könnte beispielsweise mit dem Netzwerk Ihres Ziels verbunden sein).

Andererseits bin ich mir nicht sicher, was Sie mit diesem „mit dem Internet verbundenen“ Adapter vorhaben, daher dürfte es keine große Sache sein.

Andere Tipps

Anscheinend gibt es in Vista neue Schnittstellen, die die Abfrage von Internetkonnektivität und mehr ermöglichen.Werfen Sie einen Blick auf die NLM-Schnittstellen und zwar konkret bei INNetworkConnection - Mit der GetConnectivity-Methode können Sie gezielt abfragen, ob die Netzwerkverbindung über eine Internetverbindung verfügt.

Siehe auch: Netzwerkbewusstsein unter Windows VistaLeider ist dies nur unter Vista verfügbar, daher müsste ich für XP meine ursprüngliche Heuristik beibehalten.

Ich würde mir die Routing-Tabelle ansehen.Welche Netzwerkkarte eine 0.0.0.0-Route hat UND aktiviert ist UND die niedrigste Metrik hat, ist die Netzwerkkarte, die derzeit Pakete an das Internet sendet.

In meinem Fall ist das oberste die „Internet-NIC“.

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0        10.0.0.10        10.0.0.51     20
          0.0.0.0          0.0.0.0        10.0.0.10        10.0.0.50     25
(much other stuff deleted)

Eine weitere Alternative ist Ping oder GetBestInterface 4.2.2.2 – dies ist ein alter und ehrwürdiger DNS-Server, der derzeit von GTEI betrieben wird;früher von Sprint, wenn ich mich recht erinnere.

Pingen Sie google.com über jede Netzwerkkarte.

Start > Ausführen > cmd.exe (funktioniert unter XP und Vista): ipconfig /all

Hier werden alle Informationen zu den Schnittstellen Ihres Computers angezeigt.Die „öffentliche“ Schnittstelle sollte eine öffentliche IP-Adresse haben.Für Starter, es sollte nicht sei 192.168.x.x oder 10.x.x.x :)

Wenn Sie Traceroute auf eine öffentliche Website ausführen, wird dies angezeigt.Natürlich kann es mehr als eine Schnittstelle geben, die Sie dorthin bringt.

Schauen Sie sich die Routing-Tabelle an?Im Allgemeinen verfügt die Schnittstelle, die die Standardroute enthält, über die Internetverbindung, es sei denn, Sie führen in Windows ein Routing zwischen den Netzwerken durch (was möglich, aber heutzutage für einen Client-Computer ungewöhnlich ist).

In Ihrer Frage wurde nicht näher erläutert, warum oder womit Sie dies tun, daher kann ich keine näheren Angaben machen.Das Befehlszeilentool „route“ kann hilfreich sein, aber es gibt wahrscheinlich Bibliotheken für jede Programmiersprache, die Sie zum Betrachten der Routing-Tabelle verwenden.

Sie können sich nicht auf die IP-Adresse der Schnittstelle verlassen (z. B. unter der Annahme, dass eine RFC-1918-Adresse [192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8] nicht das Internet ist), da dies bei den meisten Websites der Fall ist eine Art NAT-Firewall oder Proxy-Setup und die „Internet“-Schnittstelle befindet sich tatsächlich in einem „privaten“ LAN, das Sie ins Internet bringt.

AKTUALISIEREN:Basierend auf Ihren weiteren Informationen scheint es, als hätten Sie eine gute Lösung.Ich bin mir bei der Wahl von 0.0.0.0 nicht so sicher, da dies ein Grenzfall für die IP-Adresse ist – könnte für Ihren speziellen Plattform-/Sprachmix in Ordnung sein.Klingt (aus der API-Beschreibung) so, als ob Sie einfach eine Adresse angeben könnten. Warum also nicht eine Adresse, von der bekannt ist, dass sie im Internet liegt, z. B.die IP-Adresse Ihrer Website oder etwas Zufälligeres wie 65.66.67.68?Stellen Sie nur sicher, dass Sie keine der RFC-1918-Adressen oder den Localhost-Bereich (127.0.0.0/8) oder Multicast, einen anderen reservierten Bereich und keine Adresse auswählen, die in eine .mil- oder .gov-Datei aufgelöst wird (während dies der Fall ist). Es hört sich nicht so an, als ob getbestinterface irgendwelchen Datenverkehr sendet. Es wäre scheiße, das herauszufinden, indem man die FBI-Agenten dazu zwingt, die Tür aufzubrechen ...:) :)

Aus Netzwerksicht könnte jederzeit eine Weiterleitung ins „Internet“ erfolgen.Wenn Dinge wie das Spanning-Tree-Protokoll auf einem Switch aktiviert sind, stellen Sie möglicherweise fest, dass die ursprüngliche Routing-Karte möglicherweise nicht mehr vorhanden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top