Funktion statt char* string übergeben



  • Hallo Leute,
    ich habe eine Funktion, die eine Socketnachricht in einen Buffer schreiben soll:

    string empfangsbuffer;
    int rc;
    rc=recv(clients[i],empfangsbuffer.c_str(),256,0);
    

    Die Funktion erwartet aber ja einen char* als 2. Parameter, wie kann ich den richtig konvertieren?`

    VC 6 meldet

    error C2664: 'recv' : Konvertierung des Parameters 2 von 'const char *' in 'char *' nicht moeglich
    Durch die Konvertierung gehen Qualifizierer verloren

    Vielen Dank!!! 🙂



  • Ein String ist kein geeigneter Empfangspuffer, weil sein innerer Aufbau nicht notwendig ein Array ist (ausserdem hat dein String die Länge 0, woher soll recv denn wissen, dass es den String vorher erweitern muss?). Versuchs mal mit nem Vektor:

    vector<char> buffer(256); // Größe muss in diesem Fall manuell vorgegeben werden
    int rc = recv(..., &buffer[0], 256, 0);
    


  • du kannst die funktion aber auch,wenn du unbedingt strings benutzen willst, so verändern, dass der rückgabewert die nachricht ist...
    (oder ist die funktion aus ner lib?)



  • recv ist eine Funktion der Socket-API.



  • Tja, das ist leider das Problem mit string, Empfangen einer Nachricht mit Winsock geht leider nicht, da MUSS man einen C-String nutzen. 😞

    Mfg Eisflamme



  • mis2com: Deshalb benutz ich auch einen C-String in meinem Beispiel ... 🙄



  • Bashar:
    Schon klar, war nur noch eine explizite Erklärung, wieso du so vorgehst und die auch nur nochmal extra für Rodney.



  • aber nachher kann ich dann das ganze doch in nen string kopieren oder?

    also

    string = charbuffer oder so...



  • klar geht das..

    btw, kann es sein, dass die socket-api noch komplett in c ist?



  • otze schrieb:

    klar geht das..

    btw, kann es sein, dass die socket-api noch komplett in c ist?

    ok, ja die komplette WinApi ist doch in C oder 😕 😕



  • Ja klar, die wird auch in C bleiben 😃



  • jep...wusste garnicht dass die socket api dazu gehört, hab mich bisher immer erfolgreich davor gedrückt die winapi zu benutzen^^

    aber wenn man das so sieht weis man, dass die winapi dochs chon ausgedient hat..



  • Aber doch nicht deshalb ...



  • Übrigens ist der Socket-Teil ohne große Änderungen so auch in Linux nutzbar.



  • Aber nur der ohne WSA vornedran.

    Und Bashars Code hat nichts mit C-Strings zu tun, recv empfängt auch Binärdaten (oder kann man sich dagegen wehren?) - also sollte man im Vektor lieber Platz für 257 Elemente schaffen und das letzte auf 0 setzen, wenn man "string s = &vec[0]" schreibt. Ansonsten kann's böse Überraschungen geben, falls keine 0 empfangen wurde.

    (Eigentlich kann man hier statt eines vectors auch einfach ein statisches Array nehmen, zumindest spricht IMHO keiner der üblichen Gründe dagegen...?)



  • Bashar schrieb:

    Aber doch nicht deshalb ...

    aber unter andrem deshalb :p
    dies ist das typische problem: man arbeitet durchgehend mit der stl, und wird plötzlich mit nem char array konfrontiert,ich meine der c++ programmierer von heute ist darauf nicht vorbereitet, in solchen situationen folgt immer das typische verhalten des programmieres: er verkriecht sich auf irgendeinen schrank, und hofft, dass microsoft in den nächsten 20 minuten kapituliert, damit man endlich für ein gescheites betriebssystem programmieren kann 🙄



  • Hast du mal dran gedacht, dass es noch andere Sprachen ausser C++ gibt? C ist der kleinste gemeinsame Nenner, auf eine solche API kann man auch mit Ada oder sonstwas zugreifen. Wenn sie in C++ wär, müsste man für alle anderen Sprachen mehr oder weniger dicke (und unperformante) Wrapper bauen.



  • Das Problem liegt für mich eher in der string-Klasse, dass die die Möglichkeit für z.B. recv nicht anbietet.



  • dafür gibts aber keine möglichkeit das anständig zu handlen.
    ein string is nunmal kein char array, der speicher ist nich an einem stück, sodass man möglichkeiten wie charpointer übergeben vergessen kann,und viel mehr möglichkeiten gibt es nicht.

    und wenn mans aus diesem blickwinkel betrachtet, sollte recv dann ne überladung für strings anbieten...



  • Tja, wieso denn kein operator char*() für string?



  • Weil das die Kapselung aufbricht. string ist eine Zeichenkette, kein besseres char-Array. Wenn du sowas brauchst, solltest du es zb mit vector<char> versuchen.


Anmelden zum Antworten