Probleme beim Ping auf Solaris



  • Hi,

    ich habe mir gerade eine graphische Ping-Oberfläche (plattformunabhängig) geschrieben. Läuft ziemlich gut. Ich wollte das ganz als so eine Art Überwachung in meinem Intranet einsetzen --> automatische Meldung, wenn gewisse Rechner nicht erreichbar sind. Das ganz (Ping, NSLookup, Tracerout) funktioniert auch einwandfrei (zumindest auf Windows). Zur Information: Ich rufe nicht die auf dem Betriebssystem vorhandenen Ping-Programme auf, sondern ich erzeuge die ICMP-Packets selbst. Linux habe ich nicht getestet. Aber auf Solaris habe ich gleich 2 Probleme:
    1. ich kann mit setsockopt nicht die Optionen SO_RCVTIMEO und SO_SNDTIMEO setzen. Ich erhalte immer wieder einen SOCKET_ERROR = -1.
    2. Selbst wenn ich nun diese beiden Optionen weglasse, kann ich das Paket zwar problemlos senden, allerdings bekomme ich ein Paket mit dem Typ 172 und dem Code 25 zurück. Ich konnte in keiner Dokumentation im Internet etwas finden. Hätte von euch vielleicht jemand eine Idee, was dahinter stecken könnte?

    Vielen Dank schon mal....



  • Ich habe das Problem nun doch lösen können. Wenn es jemanden interessiert, das Problem war folgendes:
    Nachdem ich die Daten mit recvfrom in einem Buffer erhalten habe, muß ich zuerst die Länge des IP-Headers bestimmen. Das war kein Problem. Allerdings ist der Rest dann als ICMP-Header zu interpretieren.
    Folgenden Zeile habe ich dafür verwendet:

    ICMPHeader* hdr = (ICMPHeader*)((char*)buf + sizeof(IPHeader));
    

    Das ganze lief dann wie beschrieben auch unter Windows allerdings nicht unter Solaris. Nach folgender Änderung ging es dann problemlos:

    ICMPHeader* hdr = (struct ICMPHeader*)((char*)buf + sizeof(struct IPHeader));
    

    Nun sind wir alle wieder glücklich. Ich hoffe, daß noch keiner losgesucht hat. Vielleicht hilft es irgendjemandem, der mal das selbe Problem hat.



  • Hi,

    ich habe jetzt doch noch ein kleines Problem:
    ich kann den Socket für den Ping unter UNIX nicht erzeugen, wenn ich das Programm nicht mit "root"-Rechten ausführe. Folgende Zeile erzeugt den Fehler:

    SOCKET sckt = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    

    Ich habe mein Programm nun um zwei Zeilen ergänzt, so daß das ganz so aussieht:

    setuid(0);
    SOCKET sckt = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    setuid(getuid());
    

    Auch das war allerdings ohne Erfolg. Wobei ich damit eigentlich gerechnet habe. Denn ich werde ja wohl kaum mit dem Befehl

    setuid(0);
    

    das Programm bereits unter "root"-Rechten laufen lassen können. Weiß von euch vielleicht jemand, wie das bei einem Ping gelöst wird? Denn alle Ping-Programm auf UNIX-System laufen schließlich auch ohne "root"-Rechte.



  • WroteALittlePing schrieb:

    Denn alle Ping-Programm auf UNIX-System laufen schließlich auch ohne "root"-Rechte.

    Falsch. ping ist eigentlich immer setuid-root.


Anmelden zum Antworten