Fehler beim Empfangen von Daten



  • strange = recv(sock,buffer2,strlen(buffer2),0);
    

    strlen sucht nach der ersten Null in deinem nicht initialisierten buffer2 und gibt an wie viele andere Zeichen es davor gibt. Das kann 1 oder was anderes sein, kann aber auch in einem SegFault enden. Übergeben sollte man die Kapazität des Buffers.



  • Hi,
    Habe das nun mit strlen geändert tut sich aber immer nochnichts, was meinste mit intalisieren? buffer2 wurde ja deklariert das reicht doch.

    MFG ReduX



  • ReduX schrieb:

    Hi,
    buffer2 wurde ja deklariert das reicht doch.

    MFG ReduX

    NEIN! Das reicht garantiert nicht.
    Wo soll recv denn die Daten hinpacken, wenn der Funktion kein Speicher bereitgestellt wurde?

    Das musst du schon selber mit buffer2 = new char[<beliebige_länge>]; tun.



  • buffer2 hat schon seinen Speicher. Es ist ja auf dem Stack erzeugt.
    Initialisieren wäre ganz praktisch, ist aber hier nicht unbedingt erforderlich. Man sollte vielleicht noch kontrollieren ob strange <256 ist befor man auf dieses Element zugreift.

    char buffer2[256] = {}; //jetzt ist es initialisiert
    strange = recv(sock,buffer2,strlen(buffer2),0);
    if( strange > 0) // bei Fehler sollte man den schon abfangen
    {
       if( strange > 255 ) strange = 255;
       buffer2[strange]='\0';
    

    // und weiter[cpp]



  • Braunstein, du hast trotzdem ja noch strlen() drin, d.h. er versucht immer 0 Bytes zu empfangen...
    Also so ist's richtig:

    char buffer2[256] = {}; //jetzt ist es initialisiert
    strange = recv(sock,buffer2,sizeof(buffer2),0); // bzw. 256
    


  • Hi,
    kann man es dann wieder so machen wie ich es am Anfagn hatte, also das er immer ein Zeichen einliesßt und an einen string hängt bis nichts mehr kommt?
    Weil mein Programm wird in einem Bereich eingesetzt wo es schonmal sehr viele Zeichen werden können.
    Also so?:

    char buffer2 = {}; //Braucht ja nur ein Zeichen
    int strange;
    do
    {
    strange = recv(sock,buffer2,1,0);
    // Hier dann an string dranhängen
    } while(strange != 0);
    

    Bin gerade an einem anderen PC und kann hier nichts testen, würde dies dann aber so funktionieren?(Sry wenn ich frag aber hab mich mit Sockets nochnicht so beschäftigt)

    Schöner Abend noch!
    MFG ReduX



  • Es gibt kein "es kommen keine Daten mehr", d.h. entweder würde der recv() dann endlos warten, oder aber neue Daten kommen (und du würdest die dann an die alten ranhängen).

    Wenn du eine feste Puffergröße sendest, dann empfange auch gleich soviele Daten.
    Wenn du dagegen unterschiedlich lange Daten sendest, dann übertrage zuerst deren Länge (als unsigned int - und am besten mit ntohl()/htonl()netzwerktauglich machen) und lies erst die Größe aus, und danach dann die restlichen Daten am Stück.

    In einem anderen Thread hier im Forum hatte ich das schon mal erklärt
    (such mal nach recv()...)



  • Hi,
    Ja das Problem ist ich kann nicht einfach so die größe vorher senden da der Server nicht verändert werden kann(leider).
    Aber ich hab doch da mal was gelesen das wenn keine daten mehr kommen das recv dann null zurückgibt!?!?!

    MFG ReduX



  • nein, wenn recv 0 zurückgibt, heisst das, dass die verbindung (auf eine gute art) terminiert ist.



  • Hi,
    Edit:
    Ich bekomme nun bei Empfangen: Anzahl der Zeichen 9.
    Dannach stürzt das Programm ab und es werden keine daten angezeigt 😕
    MFG ReduX


Anmelden zum Antworten