2009-05-06 8 views
3

Derzeit analysieren wir die arp-Anfrageausgabe von der Befehlszeile.So erhalten Sie die MAC-Adresse eines fremden Hosts in C++

string cmd = "arp -n "; 
cmd.append(ipaddress); 
cmd.append(" | grep "); 
cmd.append(ipaddress); 
fgets(line, 130, fp); 
fgets(line, 130, fp); 
ret.append(line); 
... 

Es funktioniert, aber ist es eine Möglichkeit, dies mit einer Bibliotheksfunktion zu tun, das wird nicht so viel hängen von der nativen Kommandozeilen-Schnittstelle? Das Projekt verwendet derzeit libpcap.

Antwort

1

Im Allgemeinen hängt dies von Ihrem Betriebssystem ab. Es gibt keine echte Standard API dafür.

Angenommen, Sie sind auf Linux, öffnen und analysieren/proc/net/arp. Das Format ähnelt dem der Ausgabe des Befehls arp. Beachten Sie, dass Sie mindestens einmal ein Paket an die fragliche IP-Adresse senden müssen, um es in der ARP-Tabelle zu haben, und natürlich werden Sie nichts außerhalb Ihres lokalen Segments erhalten.

Eine IP in diesen Cache zu bekommen ist einfach - senden Sie einfach ein UDP-Paket zum Beispiel an einen unbenutzten Port - dann pollen Sie, bis es auftaucht. Eine andere Alternative wäre, einen rohen Socket zu verwenden, um ein eigenes arp-Paket zu erstellen und zu senden, aber das ist viel komplexer :) Wenn du diese Route runter gehen willst, lies den Quellcode für arping (Seite ist heute runter) , aber die git repo ist online), die auch Sie ein bisschen mehr Portabilität durch den Einsatz plattformunabhängigen-ish-Bibliotheken wie libpcap (aber erfordert root)

+0

Aber das ist der ARP-Cache, also würde es nur funktionieren, wenn wir vorher eine Anfrage an diese IP gesendet hätten. Dies bietet jedoch eine plattformunabhängigere Möglichkeit, es nach dem Absenden der Anfrage einzulesen. – voteblake

+0

Es ist nicht mehr plattformunabhängig. Es gibt keinen plattformunabhängigen Weg. Und wenn Sie eine Anfrage an diese IP senden wollen, ist es einfach - werfen Sie einfach ein zufälliges UDP-Paket. – bdonlan

+0

Es tut mir leid, es ist mehr Distro unabhängig. Ich habe falsch gesprochen. – voteblake

1

geben könnte ich bin ein wenig besorgt über die

abrufen MAC-Adresse des fremden Hosts

Teil Ihrer Frage.

Ich hoffe, dass Sie wissen, dass Sie nur Einträge in der ARP-Tabelle für Computer im selben Netzwerk erhalten. Wenn Sie über einen Router eine Verbindung zu einem Computer herstellen, wird die MAC-Adresse des Routers nur in der ARP-Tabelle angezeigt. Es gibt also keine Möglichkeit, die MAC-Adresse des fremden Hosts zu kennen, es sei denn, es ist ein Host im selben Netzwerk (keine Router beteiligt).

Die Antwort ist, dass es für Hosts, die über einen Router erreicht werden, unmöglich ist, und für den Fall, dass der Host im lokalen Netzwerk erreichbar ist, können Sie nur plattformspezifische Zugriffsmethoden verwenden, da auch die Ausgabe des arp-Befehls abweichen kann zwischen Plattformen.