2017-03-21 72 views
0

我有一个UDP服务器设置与升压/ ASIO(我复制the example,只是改变了一些东西)。下面是代码:操作取消升压asio async_receive_from

udp_server.hpp

using boost::asio::ip::udp; 

class udp_server { 
public: 
    udp_server(boost::asio::io_service&, int); 

private: 
    boost::array<char, 256> recBuffer; 

    udp::socket socket_; 
    udp::endpoint remote_endpoint_; 

    void start_receive(); 

    void handle_receive(const boost::system::error_code&, std::size_t); 

    void handle_send(boost::shared_ptr<std::string> /*message*/, 
     const boost::system::error_code& /*error*/, 
     std::size_t /*bytes_transferred*/) 
    {} 
}; 

udp_server.cpp

udp_server::udp_server(boost::asio::io_service& io_service, 
         int port) 
    : socket_(io_service, udp::endpoint(udp::v4(), port)) { 
    serverNotifications.push_back("UDP Server class initialized."); 
    start_receive(); 
} 

void udp_server::start_receive() { 
    socket_.async_receive_from(
      boost::asio::buffer(recBuffer), 
      remote_endpoint_, 
      boost::bind(&udp_server::handle_receive, 
         this, 
         boost::asio::placeholders::error, 
         boost::asio::placeholders::bytes_transferred)); 
    serverNotifications.push_back("Starting to receive UDP Messages."); 

} 

void udp_server::handle_receive(const boost::system::error_code& error, 
           std::size_t size) { 
    serverNotifications.push_back("RecFrom: " + remote_endpoint_.address().to_string()); 
    if (!error) { 
     // I do data stuff here 
    } else { 
     errors.push_back("Handle Receive error: " + error.message()); 
    } 
} 

与初始化服务器后:

try { 
    udp_server server(io_service, ApplData.PORT, (size_t)ApplData.BUFLEN); 
} catch (std::exception& e) { 
    // error handling 
} 

并运行它w ^第i个在其他功能的单独尝试捕捉io_service.run()我得到了一些问题:

  • 我的回调函数handle_receive被称为无任何UDP消息让整个网络中发送(又名只是我的笔记本电脑没有连接)
    • error.message()返回 “操作取消”
    • remote_endpoint_.address().to_string()返回 “ACFC:4000:0:0:7800 ::%2885986016”,而我不能确定的东西有用
  • 另外,我认识到我的io_service一直在停止,但根据我的理解,它应该始终运行,对吧?

我已经想过在回调函数绑定在shared_from_this ptr引用这一点,但因为我有udp_server类的实例实,直到我离开我的计划,我不能想到一个很好的理由这样做。

有人可以解释你的这种失败发生,这些错误告诉我关于我的代码或我能做些什么来避免它们?

回答

0

没关系,Rubberduck调试就足够了。我刚才读行

,但因为我有udp_server类的实例实,直到我离开我的计划,我不能想到一个很好的理由这样做。

并注意到,我实际上没有这个,这是错误。