Boost.Asio UDP async_read_from 分段错误

Posted

技术标签:

【中文标题】Boost.Asio UDP async_read_from 分段错误【英文标题】:Boost.Asio UDP async_read_from segmentation fault 【发布时间】:2012-01-18 21:47:23 【问题描述】:

我正在构建一个异步 UDP 套接字并通过使用 boost 的计时器来管理它。第二次尝试使用 socket.async_read_from 从套接字读取数据时,我遇到了分段错误。 (使用 netbeans 和调试器似乎没有做任何事情......)。我第一次阅读效果很好。 Netbeans 只是抛出一些汇编代码。我什至无法使断点工作。有什么我想念的吗?我检查了发送到 async_read_from 的每个对象的地址,一切似乎都是合法的......第一次调用 readData() 效果很好,所以我猜它与 io_service 有关?

bool ServerInstance::openServer()

try
    io_service io_service;
    this->endpoint_= new ip::udp::endpoint(ip::udp::v4(),nPortNumber_);
    this->socket_ = new ip::udp::socket(io_service, *(this->endpoint_));
  //  this->socket_->non_blocking(false);
    this->readData();

catch(std::exception &e)

    this->strErrorMsg_ = e.what();
    return false;


return true;


char* readData()
boost::array<char,80> buf;
boost::system::error_code ec = boost::asio::error::would_block;

this->startTimer();

socket_->async_receive_from(buffer(buf),*(this->endpoint_),
        boost::bind(&ServerInstance::handle_read,_1,&ec));

while(ec == boost::asio::error::would_block)

    socket_->get_io_service().run_one();

this->stopTimer();
socket_->get_io_service().reset();
return buf.data();

【问题讨论】:

【参考方案1】:

创建套接字时,我认为io_service 对象会被复制,但可惜没有。由于它是在本地声明的,因此在 establishConnection() 方法完成后被销毁。将其声明为全局指针,现在运行良好。

【讨论】:

以上是关于Boost.Asio UDP async_read_from 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio::async_read 不回调我的处理函数

优雅地取消 boost::asio::async_read

boost::asio::async_read 无限循环,接收数据为零字节

如何在到达终止字符时返回 boost::asio::async_read

boost asio async_read中的随机EOF

boost::asio::async_read 在接收到完整的 Content-Length 之前接收 EOF