2010-11-09 5 views
3

J'ai fait un serveur via le réseau boost et son fonctionnement, mais quand je stocke les clients qui s'y connectent dans std :: map, puis boucle toute la carte et en reçois il me donne la segmentation faute, Heres le backtrace (gdb):recevoir des données à partir d'un problème de socket boost

Program received signal SIGSEGV, Segmentation fault. 
boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_sock 
t_service<boost::asio::ip::tcp> >::read_some<boost::asio::mutable_buffers_1> 
    (this=0x153fe48, [email protected], [email protected]) 
    at D:/Dev-Cpp/include/boost/asio/detail/win_iocp_socket_service.hpp:294 
294  { 
(gdb) bt 
#0 boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_ 
ocket_service<boost::asio::ip::tcp> >::read_some<boost::asio::mutable_buffers_1 
(this=0x153fe48, [email protected], [email protected]) 
    at D:/Dev-Cpp/include/boost/asio/detail/win_iocp_socket_service.hpp:294 
#1 0x0040c825 in Client::receive (this=0x3d3fd0) at client.cpp:26 
#2 0x00401913 in main (argc=1, argv=0x3d2568) 
    at D:/Dev-Cpp/Bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bi 
s/basic_string.h:1456 
(gdb) 

mon client.cpp:

#include "client.h" 
#include <iostream> 
#include <boost/array.hpp> 

Client::Client(boost::asio::ip::tcp::socket* _sock) 
    : sock(_sock) 
{ 
    // 
} 

Client::~Client() 
{ 
    // 
} 

void Client::send(const std::string& msg) 
{ 
    boost::asio::write(*sock, boost::asio::buffer(msg, msg.length())); 
} 

std::string Client::receive() 
{ 
    boost::array<char, 1024> buffer; 
    boost::system::error_code err; 
    sock->read_some(boost::asio::buffer(buffer), err); 
    if (err == boost::asio::error::eof) 
     return std::string(); 

    return std::string(buffer.data()); 
} 

Que puis-je faire?

+0

Pour le code format, sélectionnez-le et appuyez sur CTRL + K. Ce n'est pas BBCode. – EboMike

+0

Pourriez-vous poster le code de stockage et d'obtenir de la carte? –

+0

oui ici: http://pastebin.com/UmC4ewW6 –

Répondre

2

Essayez ceci afin de limiter la quantité de données lues dans votre tampon read_some:

sock->read_some(boost::asio::buffer(buffer, 1024), err); 

Vous pouvez également utiliser la surcharge std::string directement:

std::string buffer(1024, 0); 
sock->read_some(boost::asio::buffer(buffer, 1024), err); 
return buffer; 
+0

@ 1er, toujours la même chose, la seconde me donne des erreurs: –

+0

buffer (string) est un const_buffer_1. read_some a besoin de tampons mutables - c'est pourquoi l'erreur – Max

+0

@Manas - ça sonne bien, pourquoi ne pas en faire une réponse? –

Questions connexes