Bytefolge der Pakete bei Socket Verbindung auslesen



  • Hallo,

    ich habe folgendes Problem:
    Ich bekomme von einer externen Hardware über TCP informationen über deren Status geschickt. Dabei repräsentiert jedes Byte einem Status die ich vom Gerät bekomme.
    Ich schreibe nun gerade ein Programm, welches diese Bytes auswerten soll.
    Zunächst habe ich - inspiriert von den vielen Socket Server Client Beispielen - einen Client geschrieben, der sich mit dem Server der Hardware verbindet.
    Das Programm verbindet sich auch erfolgreich. Nun bekomme ich aber nur irgendwelche Sonderzeichen angezeigt.
    Das liegt wohl daran,dass die Ausgabe in ASCII erfolgt. Ich will allerdings nur die reinen Bytes in hexadezimal ausgegeben bekommen. Ich habe schon ewig gesucht, aber keinen Weg gefunden wie das möglich ist.

    Das einzige was mir eingefallen ist und auch funkioniert, ist das Auslesen der Packete mit einem Packetsniffer. Ich war zwar froh, dass es so funktioniert, aber hab mich gefragt ob es nicht etwas blöd ist ein Packet welches sowieso an den Client addressiert ist noch mit einem weiteren Programm auslesen zu müssen.

    Da ich mich erst seit kurzem mit Netzwerkprogrammierung beschäftige, bin ich hier etwas unsicher und hätte gerne die Meinung eines Wissenden dazu 🙂

    Vielen Danke und Grüße

    xbeamer



  • xbeamer schrieb:

    Nun bekomme ich aber nur irgendwelche Sonderzeichen angezeigt.
    Das liegt wohl daran,dass die Ausgabe in ASCII erfolgt. Ich will allerdings nur die reinen Bytes in hexadezimal ausgegeben bekommen.

    dann gib sie doch als hexzahl aus, z.b. mit 'printf' und "%02x" als formatstring.
    🙂



  • Hallo, ich kenne Deine Implementierung nicht, aber evtl haben die "Zeichen" unterschiedliche Typgroessen(?). Vllt haben Deine Typen auf den unterschiedlichen Systemen unterschiedliche Grenzen, bei "char" kann das fatal sein (bspw. ASCII und Unicode).

    Daher verwendet man bzw konvertiert man manchmal auf Typen wie "int32_t" oder ggf. "uint32_t" (statt einfach nur "int") um die Information zu uebertragen oder auszulesen. Ein anderer Punkt fuer diesbezuegliche Fehlerquellen sind manchmal vergessene Funktionsaufrufe von htonl() oder ltonh() o.ae. um bigendian auf littelendian o. ae. zu konvertieren.

    Wenn Du wirklich wie ein Packet Sniffer "den Stream" (bzw. Paket Fragmente) auslesen willst, die bei der Data Link Layer ankommen, brauchst Du dazu einerseits die "libcap" und implementierst das ueber Raw Sockets.



  • Sorry das ich mich jetzt erst wieder melde.

    Hab das Problem inzwischen in Griff bekommen! Ich hatte mich schon zuvor am Formatieren mit printf versucht aber es hatte nicht funktioniert. Ich hab jetzt solange rum probiert bis es geklappt hat. Vielleicht war es irgend ein Fehler mit dem Datentyp. Ich weiß es nicht. Aber plötzlich kam eine Ausgabe. Also es funktioniert nun endlich. 🙂

    Vielen Dank für Eure Antworten.


Anmelden zum Antworten