encoder: C Sockets und Fragmentierung

Hallo Forumsleser

Ich möchte Daten in C (Linux) über Sockets senden und bin am Überlegen wie ich die Daten "verpacke" damit der Empfänger weiß wann er aus den vielen eingehenden Paketen eine komplette Nachricht zusammengesetzt hat.

Gibt es dafür nichts fertiges? Jeder der mit Sockets hantiert braucht das doch früher oder später.
Ich meine damit keine ausufernden Frameworks von denen man das allermeiste gar nicht braucht, sondern nur ein bisschen Code der einem das grundlegendste abnimmt.

Edit. Ich habe sowas schon mehrmals selbst gemacht in verschiedenen Sprachen. Größe vorweg schicken, der Empfänger sammelt dann Daten auf bis alles komplett ist. Aber irgendwann fragt man sich eben ob das wirklich jeder immer wieder und wieder alles selbst macht? Eigentlich ist das doch so grundlegend dass es fast schon eine Standard C Bibliothek geben könnte, ich find nur nichts.

  1. Moin encoder,

    Ich möchte Daten in C (Linux) über Sockets senden und bin am Überlegen wie ich die Daten "verpacke" damit der Empfänger weiß wann er aus den vielen eingehenden Paketen eine komplette Nachricht zusammengesetzt hat.

    Rein prinzipiell kannst du mit read auch eine große Datenmenge auf einmal von einem Socket lesen.

    Gibt es dafür nichts fertiges? Jeder der mit Sockets hantiert braucht das doch früher oder später.

    Ich habe sowas schon mehrmals selbst gemacht in verschiedenen Sprachen. Größe vorweg schicken, der Empfänger sammelt dann Daten auf bis alles komplett ist. Aber irgendwann fragt man sich eben ob das wirklich jeder immer wieder und wieder alles selbst macht? Eigentlich ist das doch so grundlegend dass es fast schon eine Standard C Bibliothek geben könnte, ich find nur nichts.

    Es gibt dafür fertige Protokolle 😉 Ansonsten klingt deine Problembeschreibung nach dem Senden von Archiven über Sockets, also z.B. ar oder tar, meinetwegen auch ZIP.

    Viele Grüße
    Robert

    1. Rein prinzipiell kannst du mit read auch eine große Datenmenge auf einmal von einem Socket lesen.

      Sofern diese Daten auch wirklich alle schon beim Empfänger vorhanden sind.
      Meines Wissens kann ein Paket in beliebig vielen Einzelpaketen ankommen und muss dann zusammengestückelt werden. Genauso können verschiedene Messages die mit verschiedenen Aufrufen von write gesendet wurden in einem einzigen Paket ankommen.

      Es gibt dafür fertige Protokolle 😉

      Meinst du Implementierungen wie FTP und so?
      Was ich brauche ist etwas wo beide Seite beliebig senden können und die Empfängerseite jeweils ein Datenpaket bekommt. Wie würde so ein Protokoll heißen?

      Inzwischen habe ich mir übrigens wieder selbst etwas zusammengefrickelt das hoffentlich fürs erste reicht.
      Bin aber nach wie vor interessiert an was existierendem.

      1. Hallo encoder,

        ich habe eine Socket-Anwendung im Betrieb, wo ich einen LPR Daemon Druckserver betreibe, um PDFs, die vom Großrechner kommen, in einer Datenbank zu speichern und per Webseite anzeigbar zu machen. Da öffne ich einen TCP Client (mit Microsoft .net) und bekomme die PDFs als eine Datenwurst, ich lese einfach so lange, bis Schluss ist. Um den Rest kümmert sich TCP.

        Mit Websockets habe ich ein bisschen gespielt, da hat die Websocket-Lib alles übernommen.

        Ich denke, dass Du low level auf IP Ebene diese Probleme hast, aber mit einem TCP Client die Arbeit erleichtert wird. Sowas gibt's sicher auch für C

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo

          Nach langem bin ich wieder an der Sache dran.

          ich lese einfach so lange, bis Schluss ist.

          Genau das war ja mein Problem 😀
          Wann ist das Ende erreicht? Kommt nochmal ein Paket das zum vorigen gehört? Oder ist mit dem jetzigen Paket schon alles da was zu dieser Übertragung gehört und das nächste Paket ist schon wieder eine neue Übertragung?
          Das weiß ich erst wenn ich ein Protokoll über die Daten lege.

          Das hab ich jetzt gemacht. Die Größe des Datenpakets steht als 4 Byte großer Wert vor den Daten. Der Empfänger stückelt dann alles was reinkommt so lange aneinander an, bis diese Größe erreicht ist.

          1. Moin encoder,

            Nach langem bin ich wieder an der Sache dran.

            ich lese einfach so lange, bis Schluss ist. Genau das war ja mein Problem 😀
            Wann ist das Ende erreicht? Kommt nochmal ein Paket das zum vorigen gehört? Oder ist mit dem jetzigen Paket schon alles da was zu dieser Übertragung gehört und das nächste Paket ist schon wieder eine neue Übertragung?
            Das weiß ich erst wenn ich ein Protokoll über die Daten lege.

            Soweit waren wir doch schon 😉

            Das hab ich jetzt gemacht. Die Größe des Datenpakets steht als 4 Byte großer Wert vor den Daten. Der Empfänger stückelt dann alles was reinkommt so lange aneinander an, bis diese Größe erreicht ist.

            4 Byte reichen aber auch nur für 4 GiB.

            Viele Grüße
            Robert

      2. Moin encoder,

        Rein prinzipiell kannst du mit read auch eine große Datenmenge auf einmal von einem Socket lesen.

        Sofern diese Daten auch wirklich alle schon beim Empfänger vorhanden sind.
        Meines Wissens kann ein Paket in beliebig vielen Einzelpaketen ankommen und muss dann zusammengestückelt werden. Genauso können verschiedene Messages die mit verschiedenen Aufrufen von write gesendet wurden in einem einzigen Paket ankommen.

        Die socket-Implementierung abstrahiert die TCP-/IP-Ebene bereits für read und write. Da ist es dann kein Unterschied, ob du aus einer Datei oder von einem Socket liest oder dorthin schreibst. Der Rückgabewert von read hilft dir sogar beim Lesen.

        Es gibt dafür fertige Protokolle 😉

        Meinst du Implementierungen wie FTP und so?

        Zum Beispiel, ja.

        Was ich brauche ist etwas wo beide Seite beliebig senden können und die Empfängerseite jeweils ein Datenpaket bekommt. Wie würde so ein Protokoll heißen?

        FTP, scp, rcp, … Wenn du wie vorgeschlagen eine Archivdatei sendest, hast du genau deine Anforderung erfüllt.

        Viele Grüße
        Robert

        1. Hallo Robert B.,

          Die socket-Implementierung abstrahiert die TCP-/IP-Ebene bereits

          Ich bin kein Linuxer. Du meinst das Öffnen eines Sockets mit AF_INET und SOCK_STREAM? So wie unter tcp(7) beschrieben?

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Moin Rolf,

            Die socket-Implementierung abstrahiert die TCP-/IP-Ebene bereits

            Ich bin kein Linuxer. Du meinst das Öffnen eines Sockets mit AF_INET und SOCK_STREAM? So wie unter tcp(7) beschrieben?

            korrekt.

            Ich sehe gerade, dass statt read und write eventuell doch recv und send verwendet werden müssen.

            Das ist übrigens relativ allgemein, weil sowohl Linux als auch Windows die BSD-Socket-API verwenden.

            Viele Grüße
            Robert