Für die Konfigurationssoftware einer Reihe von Embedded-Geräten müssen wir die Geräte nach IP-Adresse finden. Für jede gegebene IPv4-Adresse, müssen wirPinging/Abrufen von MAC-Adresse von IP, ARP-Cache ignoriert
- die MAC-Adresse herausfinden (da die MAC-Adresse gefiltert werden kann)
- herausfinden, ob das Gerät erreichbar ist, das heißt ping es.
Ich bin mir nicht sicher, was der beste Weg ist, dies zu tun ist. Zuerst haben wir versucht, SendARP
nur anzurufen, und es funktioniert ganz gut, aber es verwendet nur den Cache, wenn die IP-Adresse bereits dort ist, und es scheint keine Möglichkeit, dies zu umgehen (außer das Löschen des gesamten Caches, die eine privilegierte Operation). Das bedeutet, wir müssen einen zweiten Schritt machen und das Gerät nur anpingen (ich denke, wir sollten es zuerst anpingen und dann SendARP
anrufen, wenn es erreichbar war), aber das scheint irgendwie ein Schritt zu viel zu sein, wenn das Gerät erreichbar ist. Oder befindet sich die richtige Adresse bereits im ARP-Cache, wenn der Ping erfolgreich war? Die IP-Adresse kann die entsprechende MAC-Adresse relativ häufig ändern, da verschiedene Geräte in einem separaten Netzwerk angeschlossen sind. Ich denke, wir müssen eine tatsächliche ARP-Anfrage erzwingen.
Die Alternative, die ich mir vorstellen kann, ruft ResolveNeighbor
/ResolveIpNetEntry2
. Zumindest die Dokumentation der letzteren scheint zu sein, was wir brauchen (Clear ARP Cache für diese IP-Adresse und senden Sie eine tatsächliche Anfrage), aber es ist nur Vista oder später. Unter XP müssten wir ResolveNeighbor
anrufen, was zwar einfacher, aber nicht mehr dokumentiert ist. Dies beinhaltet die Überprüfung der richtigen Funktion (oder rufen Sie einfach ResolveNeighbor
und wenn es fehlschlägt, was dokumentiert ist auf Vista oder später tun, rufen Sie ResolveIpNetEntry2
).
Ich bin nur nicht sicher, was der beste Weg wäre, oder wenn ich etwas verpasse. Was würden Sie empfehlen? Beachten Sie, dass ich auch eine reine .NET-Lösung nehmen würde, wenn es eine gibt;)
aktualisieren:
Es scheint, dass ResolveNeighbor trotz dokumentiert, nicht auf Windows XP nicht vorhanden ist, zumindest nicht in IPhlpapi.dll. Bedeutet das, dass die Funktionalität auf XP nicht verfügbar ist?
Um dies zu verdeutlichen, entwerfe ich weder die Geräte noch den Deployment-Prozess. Für dieses Problem einfach davon ausgehen, dass
- alle Geräte bereits IP-Adressen und
- der Computer im selben Subnetz, aber nicht notwendigerweise zu dem Netzwerk gehören (also ein Tech tragbarer Computer ist) und
- die IP-Adresse ist bekannt, wenn das Tool startet, dh der Benutzer kann sie eingeben oder lesen sie aus einer Konfigurationsdatei und
- der gleiche Computer, vielleicht sogar ohne Neustart des Tools, wurde nur ein paar Sekunden verwendet, um zu verbinden ein völlig anderes Netzwerk mit den gleichen IP-Adressen, zum Beispiel ein anderes Gebäude, das gleich aufgebaut ist.
Dies bedeutet, dass ich in den Aufbau IP 192.168.0.100 haben A könnte, die MAC-Adresse A ist, und dann den Computer anschließen B zu bauen, die auch eine IP 192.168.0.100 hat, aber dieses Mal ist es die MAC-Adresse B Der Benutzer sagt "connect to 192.168.0.100" und wir müssen sicherstellen, dass 192.168.0.100 nicht nur erreichbar ist, sondern tatsächlich MAC B und nicht MAC A.Ich denke, dass ResolveIpNetEntry2 mich das tatsächlich tun lassen würde, aber es ist unter Windows XP nicht verfügbar und es scheint keine Alternative dafür zu geben.
Ich bin mir nicht sicher, wie sonst kann ich diesen Punkt bekommen. Der Punkt ist nicht, wie man die Geräte entdeckt oder installiert.
Was ist das eingebettete Gerät und erwarten Sie, dass es in der Unternehmensumgebung funktioniert? – MattH