Senden und Empfangen von std :: string über Socket

8

Ich habe ähnliche Fragen zu SO gesehen, aber meine Frage nicht beantwortet. Hier versuche ich zu senden und recv string:

Ich sende std :: string:

%Vor%

Kann es damit richtig empfangen werden?

%Vor%

Ich erhalte einen Fehler:

  

error: Ungültige Konvertierung von 'const void *' nach 'void *' [-fpermissiv] 'auf der Recv-Zeile!

    
Catty 07.09.2013, 07:15
quelle

4 Antworten

8

Nein, kann es nicht. c_str () gibt const char* zurück. Dies bedeutet, dass Sie den Inhalt des Zeigers nicht überschreiben können.

Wenn Sie die Daten erhalten möchten, müssen Sie einen Puffer erstellen, z. mit einem std::vector und benutze das dann, um ein std::string zu erstellen.

%Vor%

Der obige Code erhält 4096 Bytes gleichzeitig. Wenn mehr als 4K gesendet werden, wird die Schleife fortgesetzt und die Daten an recv angehängt, bis keine Daten mehr vorhanden sind.

Beachten Sie auch die Verwendung von &buffer[0] anstelle von buffer.data() . Die Adresse des ersten Elements ist die Möglichkeit, auf den nichtkonstanten Zeiger zuzugreifen und nicht definiertes Verhalten zu vermeiden.

    
Steve 07.09.2013 07:24
quelle
5

Nein, std::string::c_str() gibt const char* zurück, was bedeutet, dass es nur gelesen werden kann. Sie können einen lokalen Puffer zuweisen und ein Zeichenfolgenobjekt aus dem lokalen Puffer erstellen, nachdem recv erfolgreich zurückgegeben wurde.

Sie müssen recv function anweisen, eine bestimmte Länge von Daten zu lesen, zB wenn Sie jedes Mal 512 Bytes lesen möchten:

%Vor%     
billz 07.09.2013 07:21
quelle
5

Der beste Weg besteht darin, die Länge der String-Daten zuerst in einem festen Format zu senden (z. B. uint32_t in der Netzwerk-Byte-Reihenfolge). Dann kann der Empfänger dies zuerst lesen und einen Puffer der geeigneten Größe zuweisen, bevor er die serialisierte Nachricht empfängt, die danach gesendet wird.

sd und csd werden als bereits vorhandene Socket-Deskriptoren angenommen.

Sender.cpp

%Vor%

Empfänger.cpp

%Vor%

Vorteil ist. Sie müssen nicht mit mehreren gepufferten Lesevorgängen umgehen und in die empfangene Zeichenfolge kopieren. Außerdem wissen Sie auf der Empfängerseite, wann die gesendeten Daten vollständig sind.

Nachteil ist, dass Sie beim Senden der Länge zuerst ein Protokoll einführen.

    
πάντα ῥεῖ 07.09.2013 21:21
quelle
0
  

error: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive] auf der Recv-Leitung!

Wenn Sie sich in diese spezielle Frage einwählten, schrieben Sie ( sans die if -Anweisung):

%Vor%

rcv.c_str() ruft einen const char* -Zeiger ab. Die const char* wurde auf const void* gezwungen. Die einzige Möglichkeit, einen nichtkonstanten Zeiger zu erhalten und ein undefiniertes Verhalten zu vermeiden, ist die Adresse des ersten Elements in einem std::string oder std::vector :

%Vor%

Das Erhalten des nichtkonstanten Zeigers ist nur für STL-Container gültig, die zusammenhängenden Speicher bereitstellen. Der Trick funktioniert nicht für map , multimap oder andere assoziative Container.

@ πάντα-ῥεῖ ist die einzige Antwort, die darauf anspricht, aber er hat den Punkt nicht betont.

    
jww 03.01.2018 01:57
quelle

Tags und Links