Empfangen mit einer festen Buffer-Grösse



  • Hallo Zusammen,

    ich habe folgende Frage:

    Ich habe einen tcp client-server wo einmal bei 2. byte ein '\0' von festen 1024 byte Nachricht transportiert werden muss. Nun wenn ich mit

    #define MAXLENGTH 1024
    while(recv(fd, buffer, MAXLENGTH, NULL) > 0 ) { /* do sth */; }
    

    versuche, dann wird das erste byte in den buffer aufgenommen, danach da das zweite byte '\0' ist, hört der Listener auf den Socket weiter zu lesen...

    Wie kann ich den "Listener" zum Empfang kompletten 1024 bytes zwingen, ohne bei
    2.byte abzubrechen?

    Danke und Gruss,



  • 1. Solltest Du den Rückgabewert von recv überprüfen, da sowieso nie garantiert ist, dass die Pakete in der Stückelung eintreffen, wie sie abgeschickt wurden.
    2. Wirst Du dabei feststellen, dass der Rückgabewert > 2 ist, also durchaus mehr Bytes empfangen wurden.
    3. Wird Dein Problem dadurch vermutlich daran liegen, dass Du printf oder str*-Funktionen auf die Daten anwendest, die von Natur aus beim ersten Nullbyte aufhören zu arbeiten.



  • Versende den String ohne Nullbyte und schreib es nach dem Empfang des kompletten Strings an dessen zweite Stelle.



  • MfG schrieb:

    Versende den String ohne Nullbyte und schreib es nach dem Empfang des kompletten Strings an dessen zweite Stelle.

    Naja, es ist ne Idee... Nun aus Konformitätsgründen müsste ich aber doch \0
    schicken, denn RFC1006 hat den Paketstruktur so festgelegt (es geht um TPKT
    wrapping für H.248 Protocol über TCP). Da wird der zweite Byte als reserved vorgesehen was wiederum 0x00 ist.

    Gruss,



  • hast du den Beitrag von LordJaxom übersehen? 🙄



  • Du kannst doch mal den Buffer binär dumpen (d.h. wie Lordjaxom bereits geschrieben hat, keine printf oder str*-Funktionen verwenden, sondern fwrite).

    Vielleicht hört der Listener nicht auf, sondern deine Ausgaberoutine schreibt nur das 1. Byte, weil es an buf[1] bereits das NUL-Byte sieht.



  • Hei,

    TPKT schrieb:

    hast du den Beitrag von LordJaxom übersehen? 🙄

    nicht wirklich. Ich weiss dass die recv sich etwas wild benimmt und mir möglicherweise was weniger liefert als ich mit meinem MAXLENGTH erwarte. Die
    printf Varianten sind wenig interresant weil mich erst den Abdruck des Packets
    bei Wireshark interresiert.

    Was mich aber auf der anderen Seite beschäftigt hat, dass die Daten von Client
    in TCP-Stream schon durchgestellt worden sind wie:

    [folge korrugiert]
    -d1-\0-d3-d4-d5-....-d1022-d1023-\0..

    und jedoch recv steigt schon bei dem ersten Nullbyte raus(2 von oben) und möchte nicht mehr den
    Rest der Daten aufnehmen. Ich habe erst gedacht, dass es daran liegt dass der
    Client den Socket zumacht:Damit wäre der Socket zu bzw. Betriebsmittel gelöscht
    bevor der Listener afu den Betriebsmittel zum zweiten Mal zugreift. Deswegen
    habe ich den Sender in eine while(1){;} genestet (nach dem Paketversand) aber
    der Listener steigt trotzdem bei dem ersten Nullbyte raus.

    So deswegen ist die Frage ob ich mit dem Listener irgendwie blockiert warten
    kann bis der angegebene Grösse vom Client vollständig gelesen wird.

    Danke,



  • Xantus schrieb:

    Du kannst doch mal den Buffer binär dumpen (d.h. wie Lordjaxom bereits geschrieben hat, keine printf oder str*-Funktionen verwenden, sondern fwrite).

    Vielleicht hört der Listener nicht auf, sondern deine Ausgaberoutine schreibt nur das 1. Byte, weil es an buf[1] bereits das NUL-Byte sieht.

    ok. ich werde das mal ausprobieren und melde ich mich noch (heute)...


Log in to reply