简体   繁体   English

从boost socket问题接收数据

[英]receiving data from a boost socket problem

i made a server via boost networking and its working good but when i store the clients connecting to it in a std::map, then loop all the map and receive from them it gives me segmentation fault, heres the backtrace (gdb): 我通过boost网络制作了一个服务器,但是当我在std :: map中存储连接到它的客户端时,然后循环所有地图并从它们接收它给我分段错误,继承回溯(gdb):

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, buffers=@0x22fa48, ec=@0x22fa50)
    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, buffers=@0x22fa48, ec=@0x22fa50)
    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)

my client.cpp: 我的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());
}

What can i do about it? 我该怎么办?

Try this, to limit the amount of data read into your read_some buffer: 试试这个,限制读入read_some缓冲区的数据量:

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

You could also use the std::string overload directly: 您也可以直接使用std::string重载:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM