char in string konvertieren (Socket Programmierung, erhaltene Daten)



  • Hallo leute,

    habe folgenden Code geschrieben:

    void Connection::rD(){
     char buf [2048];
     int bytes;
    
     bytes = recv(sock,buf,sizeof(buf)-1,0);
    
     if (bytes==-1)
     {
       perror ("Error");
     }
    
     buf [bytes] = '\0';
     printf("Erhalten: \"%s\"\n",buf);
    }
    

    Ich habe ein Problem mit den Stuerzeichen. Wie kann ich es bewerkstelligen, dass ich die Daten in einen String speichere ?

    (Weiss es klingt ziemlich banal, aber habe schon mehrere Ansätze veruscht ohne Erfolg deshalb wollte ich mal dirket hier rein posten!)

    Ich bedanke mich im vorraus für eure netten Ansätze.

    MfG


  • Mod

    Suchst du dies?

    std::string str(buf, buf+bytes-1);
    

    Ich werde aus deiner Frage nicht so 100% schlau. Machst du überhaupt C++ und ist es das was du mit String meintest? Warum nutzt du es dann nicht gleich? Und was soll diese Nullterminierung, wenn buf doch anscheinend Binärdaten enthält und keine Zeichenkette (du schreibst ja, du hättest Probleme mit Steuerzeichen)?



  • danke, für deine Rückmeldung...

    -Ich mache eigentlich C++ nur meine Socketprogrammierung basiert auf C.

    -Ich habe es mal selbst probiert was nicht geklappt hatte und dann hatte ich es mit der Nullterminierung, welches ich von einem Tutorial mir abgeschaut habe. Leider hat mir dies nicht mit dem String geholfen.

    -Wie wäre es denn besser gewesen ? Kannst du es bitte in mein Code implementieren ?


  • Mod

    Gast 1233 schrieb:

    -Wie wäre es denn besser gewesen ? Kannst du es bitte in mein Code implementieren ?

    Naja, ich weiß nicht genau, was es machen soll, daher ist es ein bisschen schwierig, es besser zu machen 🙂 . Eine schlampige Übersetzung deines Codes sieht so aus:

    void Connection::rD(){
     string buf(2048,0); // Vom vermutlichen Verwendungszweck her eigentlich eher vector<char>, aber string ist besser für spätere Ausgabe
    
     int bytes = recv(sock,&buf[0],buf.size(), -1,0);
    
     if (bytes==-1)
     {
       perror ("Error");
     }
    
     cout << "Erhalten: " << buf << "\n";
    }
    

    std::string kann natürlich nicht auf magische Weise Steuerzeichen ausgeben, aber immerhin bekommst du beim Ausgeben keine Probleme mit eventuellen Nullzeichen.



  • Vorerst vielen Dank für deine Bemühung 🙂

    Wenn ich das jetzt wie d es gemacht habe bei mir Implementiere, habe ich immernoch das selbe Problem. Die UCF-8 Zeichen werden als ganz seltsame hyroglyphen dargestellt! 😞

    Es ging mir nur drumm die steurzeichen (bzw. punkte die in hex angegeben sind) auch auszugeben! Das klappt leieder nicht :(:(



  • Meines Wissens tut std::string nicht garantieren, dass der Speicher am Stück ist (somit muss &str[0] nicht unbedingt funktioniert im Sinne von Zeiger auf Stück Speicher).

    Das garantiert std::vector<..> welcher dafür benutzt werden sollte.

    Simon



  • Hallo Simon, danke für deine Beteiligung...

    Wie würde ich es in Vector implementieren ?



  • vector<char> buf(2048);
    ...
    cout << "Erhalten: " << &buf[0] << "\n";
    

    Wobei das Problem hier wieder das terminierende Zeichen ist. Du müsstest die Daten eigentlich erst in eine anzeigbare Form bringen.

    Ist natürlich richtig der Adressoperator muss hier angewendet werden. Für dein Problem ist es aber nicht weiter von belang die Daten in ein String stopfen zu müssen.



  • std::string(buf.begin(), buf.begin() + numerOfReceivedBytes);



  • Hallo Nick,

    mit deiner Lösung besthet das Problem weiterhin, bezüglich der Anzeige...
    Was ich vorallem seltsam finde, ich habe beim Aufruf eine while Schleife, doch nach 5-10 aufrufen der Recieve Verbindung bricht sie ab! Kann es sein, dass die Variable buf einfach volläuft ?

    theata wie würde ich es denn in mein Code implementieren genau was du meinst ? Verstehe gerade den zusammenhang nicht!



  • @nick: bzw. die Kommunikation zwischen Sever besteht noch (laut wireshark, kein Fin gesendet) und die Konsole läuft auch noch! Nur Es macht keine Ausgabe mehr bezüglich der empfangenen Daten und sendet kein erneuten Request mehr, es stockt quasi nach dem 5-10 Aufruf (der anzahl der Aufrufe variiert auch seltsamerweise)



  • @nick: Das Problem mit der Variable vollaufen hat sich gelöst... habe die größe von buf auf (512) reduziert und es funktioniert jetzt, weshalb auch immer! Das Problem mit dem steuerzeichen habe ich immer noch!!!



  • Problem wieder gelöst...

    Nur eine letzte frage habe ich noch! Und zwar was bewirkt der Parameter hinter dem Vektor, ob ich den nun auf 512,1024 oder nur 64 stelle ?

    Habe mit wireshark gemerkt, dass ich viel mehr Pakete schaffe um so niedriger ich den Parameter wähle!


  • Mod

    Gast 1233 schrieb:

    Nur eine letzte frage habe ich noch! Und zwar was bewirkt der Parameter hinter dem Vektor, ob ich den nun auf 512,1024 oder nur 64 stelle ?

    Eine C++-Referenz sollte man immer blickbereit haben:
    http://www.cplusplus.com/reference/stl/vector/vector/



  • Man sollte übrigens vorher wissen, wieviel Daten man lesen möchte und nicht einfach irgendwas lesen. Ob Daten zum Lesen vorhanden sind, kannst du mit select ermitteln. Wenn Daten zum Lesen vorhanden sind, du aber 0 Bytes liest, dann heißt das, dass die Verbindung beendet wurde.


Log in to reply