IP-Adresse anpingen und Antwort verarbeiten
-
Hallo,
ich habe einen Vector den der Benutzer über cin mit IP-Adressen befüllt. Jetzt will ich, dass jede IP-Adresse angepingt werden soll und die Antwort verarbeitet werden soll, d.h. wenn die IP-Adresse nicht antwortet soll sie aus dem Vector gelöscht werden.
Hat jemand einen Vorschlag wie ich das am besten realisieren soll?
Vielen dank schon mal!
-
Willst du die Adressen wirklich selbst anpingen? Das ist leider nicht "mal eben so" geschrieben.
http://www.zotteljedi.de/ping/index.html
Abgesehen davon ist das kein Standard-C++Ansonsten könntest du auch einfach _popen (Windows) nutzen, aber das ist natürlich total uncool.
-
So kann man das machen (zwar etwas umständlich,und uncool (;-)) aber es geht!)
... string ip = "127.0.0.1"; //Die IP-Adresse string cmd = "ping "; //Wir machen das ganze per Eingabeaufforderung, da lautet der Befehl zum Anpingen ping und dann die IP-Adresse cmd += ip; //Jetzt die IP-Adresse hinzufügen cmd += ">ping.txt"; //Wir leiten die Ausgabe des Ping-Befehls in eine Datei um system(cmd); //Und jetzt führen wir den Befehl auch aus, jetzt haben wir die Ausgabe vom Ping in einer Datei namens ping.txt, jetzt müssen wir das nurmehr auslesen //Dazu speichern wir die Datei zeilenweise in dem Array ping_ergebnis string ping_ergebnis[1000]; fstream ping_datei; while (!ping_datei.eof()) { int i=0; getline(ping_datei, ping_ergebnis[i]; }
Die Datei könnte irgendwie so aussehen (Beim anpingen des eigenen Computers:
Ping wird ausgefhrt fr Lap1 [::1] mit 32 Bytes Daten: Antwort von ::1: Zeit<1ms Antwort von ::1: Zeit<1ms Antwort von ::1: Zeit<1ms Antwort von ::1: Zeit<1ms Ping-Statistik fr ::1: Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0 (0% Verlust), Ca. Zeitangaben in Millisek.: Minimum = 0ms, Maximum = 0ms, Mittelwert = 0ms
Und jetzt halt noch das Ergebnis verarbeiten.
-
ok, Vielen Dank!
Hast du vielleicht noch einen Vorschlag wie ich das Ergebnis am besten Filtern kann?
-
Walpurgisnacht schrieb:
ok, Vielen Dank!
Hast du vielleicht noch einen Vorschlag wie ich das Ergebnis am besten Filtern kann?Erstmal probieren, ob ping nicht eine 0 bei Erfolg was anderes bei Fehlern zurückgibt.
Windows macht es seit WinXP. Von den linuxern erwarte ich das eigentlich erst recht.
Alsoint rc=system(cmd); if(!rc) cout<<"Rechner lebt"
-
komisch, sobald ich das so mache wie du gesagt hast bekomme ich für IP-Adressen nichts und für Webseiten (egal ob es sie gibt) "Rechner lebt".
-
#include <iostream> #include <string> #include <cstdlib> bool Ping(const std::string& url); void Test(const std::string& url); int main() { std::cout << "Testing...\n" << std::endl; Test("127.0.0.1"); Test("localhost"); Test("www.c-plusplus.net"); Test("www.example.org"); Test("www.adskjasjkdaskjdas"); Test("www.asdaskdaskdskd.com"); Test("www.google.de"); Test("192.168.1.12"); Test("192.168.2.4"); Test("192.11.12.1"); Test("85.12.22.9"); return 0; } bool Ping(const std::string& url) { std::string cmd = "@ping -n 1 " + url + " > out"; return system(cmd.c_str()) == 0; } void Test(const std::string& url) { std::cout << url << ":\t\t"; if (Ping(url)) { std::cout << "ONLINE :-)" << std::endl; } else { std::cout << "OFFLINE :-(" << std::endl; } }
-
Habs nur unter Windows getestet. Für andere Betriebssysteme könnte diese Vorgehensweise falsche Ergebnisse liefern.
-
Unter Windows gibt´s die Funktion IcmpSendEcho und IcmpSendEcho2, die Benutzung ist eigentlich ziemlich einfach. In der MSDN Doku gibt´s dazu sogar ein komplettes Beispiel.
-
Walpurgisnacht schrieb:
ok, Vielen Dank!
Hast du vielleicht noch einen Vorschlag wie ich das Ergebnis am besten Filtern kann?Nach welchen Kriterien? In dem Array ping_ergebnis hast du die einzelnen Zeilen in jedem Eintrag. Also einfach if und else anwenden!
Wenn du die Antwort-Zeit in einen Integer kriegen willst, um sie weiter zu verarbeiten, dann verwende einfach einen Stringstream:
(Am Beispiel der Datei in meinem ersten Beitrag)stringstream ping; int ping_return; ping << ping_ergebnis[1][22]; ping >> pingreturn;
Und schon hast du die Antwortzeit (In dem Beispiel eben 1) in einem Integer und kannst dann
if (pingreturn < 5)
usw...
-
Hallo,
also die Lösung von löälöä funktioniert partiell, die Funktion gibt allerdings auch dann 1 zurück, wenn der ping gesendet werden konnte und eine ordentliche fehlermeldung zurückkommt.
löälöä schrieb:
bool Ping(const std::string& url) { std::string cmd = "@ping -n 1 " + url + " > out"; return system(cmd.c_str()) == 0; }
Und den " > out" Part braucht man nur, wenn man beabsichtigt für jeden Funktionsaufruf die Datei "out" zu erstellen, in den die Ausgabe geschrieben wird. Das braucht allerdings nicht jeder und kostet beim schnellen IP-durchpingen Zeit.
Und das "@" ist meiner Ansicht nach völlig funktionslos?
Danke aber trotzdem für den Code, hab viel gelernt
dementia