2017-01-28 2 views
2

J'essaye de lire depuis un socket asio dans une chaîne std :: sans copier. Cette implémentation semble fonctionner mais je ne suis pas sûr que ce soit fiable.Écrire depuis asio :: ip :: tcp :: socket directement vers std :: string

string read(int bytes) 
{ 
    string str; 
    str.resize(bytes); 
    char* buffer = (char*) str.data(); 
    //socket is declared as class member 
    asio::read(socket,asio::buffer(buffer,bytes)); 
    return str; 
} 
+1

Votre question tombe dans la catégorie générale de "puis-je écrire directement dans le tampon' std :: string'? ". [On dirait un doublon] (http://stackoverflow.com/questions/25169915/is-writing-to-str0-buffer-of-a-stdstring-well-defined-behaviour-in-c11) – PaulMcKenzie

+0

Ce qui vous rend incertain ? –

+0

@PaulMcKenzie ouais c'était à peu près la réponse que je cherchais mais est 'string.data()' et '& string [0]' pareil? – Freggar

Répondre

2

Oui cela fonctionne. Mais il sera beaucoup plus rapide à utiliser directement:

std::string read(int bytes) 
{ 
    std::string str; 
    str.resize(bytes); 

    asio::read(socket, asio::buffer(str)); 
    return str; 
} 

De cette façon, vous évitez tous les ness méchant de votre fonte style C réinterpréter. (Qui d'ailleurs a également rejeté const)