winapi - send() mit std::string im Argument



  • Hallo,

    ich probiere schon seit geraumer Zeit unter Windows XP mit MinGW mittels send() Strings über das Netz zu verschicken.
    Leider ist das arbeiten mit cstrings äußerst lästig (und in vielen Postings wird auch davon abgeraten) aber ich schaffe einfach nicht:

    a) send() dazu zu bringen std::string als Parameter zu akzeptieren
    b) einen guten cast von std::string nach char* durchzuführen

    So etwas möchte ich verwirklichen;

    string sendemich="Hallo Welt\n\n\n3 Zeilen weiter";
      rs=send(socket,sendemich,(int)strlen(sendemich),0);
    

    bishermache ich es so:

    const char *p;
    	temp="sendme";
    	p=temp.c_str();
    	strcpy(buf,p);
            send(s,buf,strlen(buf),0);
    

    Das ist aber unsauber und manchmal(zwar selten aber...) kommt Schrott beim Gegenüber an...

    Dei Fehlermeldung beim compilieren mit String als Parameter:

    main.cpp: In function `int main()':
    main.cpp:176: error: cannot convert `std::string' to `const char*' for argument
    `1' to `size_t strlen(const char*)'
    main.cpp:176: error: cannot convert `std::string' to `const char*' for argument
    `2' to `int send(unsigned int, const char*, int, int)'
    

    Ich schaffe es alleine einfach nicht. 😞
    Weiss jemand Rat? Auch Codeschnipsel würden zum Verständnis beitragen...

    Gruss
    Robin



  • std::string str;
      str = "Hallo Welt";
      send(s, str.c_str(), (int) str.size(), 0);
    


  • Setz unter deine Includierungen:

    using namespace std;
    

    Danach nimm überall das std:: weg, und probier es nocheinmal. Wenn es nicht helfen sollte, dann weiß ich nichts mehr.

    Mfg Ominion

    [EDIT]Jochen war schneller als ich.[/EDIT]



  • Jochen Kalmbach schrieb:

    std::string str;
      str = "Hallo Welt";
      send(s, str.c_str(), (int) str.size(), 0);
    

    Ja, das war eines der ersten Dinge, die ich versucht hab. Das war heute morgen gegen 10 Uhr oder so... So lang bin ich schon dran....
    Ich weiss nciht mehr, wieso das nicht ging, aber ich probiers gerne nochmal..

    Ominion, ich hab das std:: nur hier im Codeschnipsel stehen. In der main bin ich im std-namespace...



  • Hmm, das gibts ja gar nicht - jetzt klappts.

    Ich trau der ganzen Sache zwar noch nicht so ganz, aber ich werde mal meinen ganzen Code umschreiben...

    Jetzt traue ich mich fast gar nicht zu fragen.....

    Der Umgekehrte Weg wäre dann beim recv() so wie hier?

    s=verbundener Socket
    char buf[4096];
    rc=recv(s,buf,1024,0);
    string str((LPCTSTR)buf);
    

    Oder denke ich hier in eine falsche Richtung?



  • std::Robin schrieb:

    Der Umgekehrte Weg wäre dann beim recv() so wie hier?

    s=verbundener Socket
    char buf[4096];
    rc=recv(s,buf,1024,0);
    string str((LPCTSTR)buf);
    

    Du solltest casts immer vermeiden, wenn sie nicht wirklich benötigt werden!
    also

    string str(buf);
    

    PS: An dem Beispiel siehst Du jetzt auch schon das Problem (hoffentlich)! Du weisst im voraus nicht, wie lange der String ist... deswegen würde ich Dir Raten zuerst die länge des Strings zu senden (4 byte) und dann den String. Somit wird das empfangen einfacher...



  • es is gut möglich dass du die Klammern beim Obj.c_str() vergessen hast, is mir mal passiert, dann kommt da nur Schrott raus 😮 😃



  • Ach Herrjeh - das koennte sogar sein.
    Da bin ich um ein paar Jährchen gealtert - nur wegen sowas....
    Und die ganze Arbeit den Code nach char[] umschreiben und und jetzt wieder alles Rückgängig....
    *seufz*

    Naja, jetzt gehts schneller, da ich größtenteils nur auskommentiert hab.

    Vielen Dank an alle!
    R


Log in to reply