char in string konvertieren (Socket Programmierung, erhaltene Daten)


  • 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.


Anmelden zum Antworten