【发布时间】:2017-03-21 13:29:44
【问题描述】:
我有一个使用 boost/asio 设置的 UDP 服务器(我复制了 the example 并只是更改了一些东西)。下面是代码:
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
}
在另一个函数中使用io_service.run() 单独运行它,我遇到了一些问题:
- 我的回调函数
handle_receive被调用,而没有任何 UDP 消息在整个网络中发送(也就是我的笔记本电脑没有连接)-
error.message()返回“操作已取消” -
remote_endpoint_.address().to_string()返回“acfc:4000:0:0:7800::%2885986016”,我无法确定它是有用的
-
- 我也意识到我的
io_service一直在停止,但据我了解,它应该一直在运行,对吗?
我已经考虑在回调函数中引用 this 与 shared_from_this ptr 绑定,但由于我有一个 udp_server 类的真实实例,直到我离开我的程序,我想不出这样做的充分理由.
有人能解释一下你发生了这个失败吗,这些错误告诉我我的代码是什么,或者我可以做些什么来避免它们?
【问题讨论】:
标签: c++ boost server udp boost-asio