操作取消提升 asio async_receive_from
Operation canceled boost asio async_receive_from
我用 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()
returns "Operation canceled"
remote_endpoint_.address().to_string()
returns "acfc:4000:0:0:7800::%2885986016" 我无法确定它是否有用
- 我也认识到我的
io_service
一直在停止,但根据我的理解,它应该一直 运行,对吗?
我已经考虑过在使用 shared_from_this ptr
绑定的回调函数中引用它,但是因为在我离开我的程序之前我有一个 udp_server
class 的真实实例,我可以想不出这样做的充分理由。
有人能解释一下发生这种故障的原因吗?这些错误告诉我关于我的代码的哪些信息,或者我可以做些什么来避免这些错误?
没关系,Rubberduck 调试就足够了。我刚读了行
but since I have a real instance of the udp_server class until I leave my program I can't think of a good reason to do that.
并注意到,我实际上没有这个,这就是错误。
我用 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()
returns "Operation canceled"remote_endpoint_.address().to_string()
returns "acfc:4000:0:0:7800::%2885986016" 我无法确定它是否有用
- 我也认识到我的
io_service
一直在停止,但根据我的理解,它应该一直 运行,对吗?
我已经考虑过在使用 shared_from_this ptr
绑定的回调函数中引用它,但是因为在我离开我的程序之前我有一个 udp_server
class 的真实实例,我可以想不出这样做的充分理由。
有人能解释一下发生这种故障的原因吗?这些错误告诉我关于我的代码的哪些信息,或者我可以做些什么来避免这些错误?
没关系,Rubberduck 调试就足够了。我刚读了行
but since I have a real instance of the udp_server class until I leave my program I can't think of a good reason to do that.
并注意到,我实际上没有这个,这就是错误。