string über socket versenden



  • Hi zusammen,

    ich kann wie folgt einen String über einen Socket versenden und auf der Gegenseite empfangen:

    //sender
    std::string sendText("sendeText");
    send(socket,sendText.c_str(),sendText.length(),0);
    
    //empfänger
    char empfangeText[256];
    recv(socket,empfangeText,255,0);
    

    Nun sieht man, dass es bis 256 Zeichen gut funktioniert! Aber es soll durchaus möglich sein mehr als 256 Zeichen zuversenden bzw zu empfangen.

    Ich dachte mir so etwas zu machen:

    //sender
    std::string sendText("sende dies");
    std::stringstream sstr(sendText.length());
    send(socket,sstr.str().c_str(),sstr.str().length(),0); //erst die Länge des Strings
    send(socket,sendText.c_str(),sendText.length(),0); // dann den eigentlichen Text
    
    //empfänger
    char l[256];
    recv(socket,l,255,0);
    int length = atoi(l);
    char *empfangeText = new char[length];
    recv(socket,empfangeText,length,0);
    ......
    delete[] empfangeText;
    

    so habe ich die Möglichkeit einen Array anzulegen der unterschiedlich groß sein kann. Aber dies klappt irgendwie nicht. Wo mach ich den Fehler? 😕

    Danke im Voraus!



  • Siehe hier...



  • Hey Danke ich werde es mir anschauen 😉



  • Oder noch besser gleich binär verschicken:

    size_t size = sendText.length();
    send(socket, reinterpret_cast<const char*>(&size), sizeof(size_t), 0);
    

    Und entsprechend lesen:

    size_t size;
    recv(socket, reinterpret_cast<char*>(&size), sizeof(size_t), 0);
    

    (sofern Sender und Empfänger dieselbe Architektur bzgl. Endian besitzen, ansonsten noch ntohl bzw. htonl verwenden)



  • Th69 schrieb:

    Oder noch besser gleich binär verschicken:

    size_t size = sendText.length();
    send(socket, reinterpret_cast<const char*>(&size), sizeof(size_t), 0);
    

    Und entsprechend lesen:

    size_t size;
    recv(socket, reinterpret_cast<char*>(&size), sizeof(size_t), 0);
    

    (sofern Sender und Empfänger dieselbe Architektur bzgl. Endian besitzen, ansonsten noch ntohl bzw. htonl verwenden)

    Klar, und wenn z.B. ein Browser sich so auf den Port connected, dann platzt der Puffer.



  • Klar, und wenn z.B. ein Browser sich so auf den Port connected, dann platzt der Puffer.

    Wieso, man kann doch Grenzen setzen.
    Und im Zweifelsfall muss halt bei der Verbindung eine Magic-Number gesendet werden.



  • Ich möchte mich mit meinem wenigen Kenntnissen nicht einmischen aber bei mir kann es der Fall sein, dass beide seiten nicht die gleiche Architektur bzgl. Endian haben. Ich wollte "nur" ein string mit variabler Länger von der einen auf die andere Seite transportieren 🙂

    Ich habe mein Lösungsansatz schon unten vorgestellt. gibt es dort eventuell Verbesserungsmöglichkeiten?



  • Verfolger schrieb:

    Ich wollte "nur" ein string mit variabler Länger von der einen auf die andere Seite transportieren 🙂

    Wenn du wirklich _nur_ das möchtest, dann könntest du auch einfach empfangen bis die Verbindung geschlossen wird. (-1 = Fehler, 0 = Ende.)



  • Oder, zwar ein bischen imperformant, aber bei dem Netzwerkoverhead egal: Schick die terminierende 0 mit und lies kleine Brocken, bis die 0 gefunden wurde.



  • Ethon schrieb:

    Oder, zwar ein bischen imperformant, aber bei dem Netzwerkoverhead egal: Schick die terminierende 0 mit und lies kleine Brocken, bis die 0 gefunden wurde.

    Was sind denn kleine Brocken?



  • TyRoXx schrieb:

    Ethon schrieb:

    Oder, zwar ein bischen imperformant, aber bei dem Netzwerkoverhead egal: Schick die terminierende 0 mit und lies kleine Brocken, bis die 0 gefunden wurde.

    Was sind denn kleine Brocken?

    Sinnvoll würde ich sizeof(CharT) definieren.



  • Ich weiß zwar nicht, was CharT sein soll, aber die Null am Ende zu finden erfordert nicht das Byte-weise Empfangen des Strings.



  • TyRoXx schrieb:

    Ich weiß zwar nicht, was CharT sein soll, aber die Null am Ende zu finden erfordert nicht das Byte-weise Empfangen des Strings.

    Naja, ein Null-Char ist in einem UTF-32 String logischweise 4 Byte groß, in einem ASCII/UTF8 1 Byte etc.

    Klar muss man nicht byteweise einlesen.


Log in to reply