2012-01-18 74 views
0

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

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()方法完成后将被销毁。宣布它是一个全局指针,现在它工作得很好。