Boost.Asio UDP async_read_from ошибка сегментации - PullRequest
0 голосов
/ 19 января 2012

Я строю асинхронный 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 Ответ

1 голос
/ 19 января 2012

Когда сокет создан, я думал, что объект io_service будет скопирован, но, увы, нет.Поскольку он был объявлен локально, он уничтожается после завершения метода establishConnection().Объявлен как глобальный указатель, и теперь он отлично работает.

...