提升::ASIO 取消或关闭对async_handle不起作用
boost::asio cancel or close doesn't work on async_handle
boost::asio::ip::udp:socket 不能取消 (( async_handle,也不能关闭((。
这是测试程序:
{
boost::asio::io_context io_core;
boost::asio::ip::udp::socket udp_socket1(io_core, udp::v4());
char buff[200];
boost::asio::ip::udp::endpoint endpoint1(boost::asio::ip::address::from_string("127.0.0.1"), 9999);
cout << udp_socket1.is_open() << endl;
udp_socket1.async_send_to(boost::asio::buffer(buff, 200), endpoint1, [&udp_socket1](const boost::system::error_code& ec, size_t wlen) {
cout << udp_socket1.is_open() << endl;
//assert(0);
});
cout << udp_socket1.is_open() << endl;
udp_socket1.close();
udp_socket1.async_send_to(boost::asio::buffer(buff, 200), endpoint1, [&udp_socket1](const boost::system::error_code& ec, size_t wlen) {
cout << udp_socket1.is_open() << endl;
//assert(0);
});
cout << udp_socket1.is_open() << endl;
udp_socket1.close();
io_core.run();
system("pause");
}
根据文档定义 Boost 1.67.0、WIN10、vs2017 BOOST_ASIO_DISABLE_IOCP和BOOST_ASIO_CANCELIO
我没明白重点吗?
如果我是对的,如何解决这个问题?
异步操作不会立即完成。您的代码看起来与您期望的一样。
简化代码以:
住在科里鲁
#include <boost/asio.hpp>
#include <iostream>
using boost::asio::ip::udp;
int main() {
std::cout << std::boolalpha;
boost::asio::io_context io;
boost::asio::ip::udp::socket s {io, udp::v4()};
boost::asio::ip::udp::endpoint const ep {{}, 9999};
auto trace = [&s](char const* caption) { std::cout << caption << s.is_open() << std::endl; };
auto handler = [=](boost::system::error_code, size_t) { trace("handler: "); };
trace("main #1: ");
char buff[200] = {};
s.async_send_to(boost::asio::buffer(buff), ep, handler);
trace("main #2: ");
s.close();
s.async_send_to(boost::asio::buffer(buff), ep, handler);
trace("main #3: ");
s.close();
io.run();
}
处理程序仅在io.run()
之后运行是有道理的;显然,插座在第一次关闭之前只是"打开"的:
main #1: true
main #2: true
main #3: false
handler: false
handler: false
这完全是意料之中的。因此,您应该处理错误:
住在科里鲁
auto trace = [&s](char const* caption) { std::cout << caption << (s.is_open()?"open":"closed") << std::endl; };
auto handler = [=](boost::system::error_code ec, size_t) {
trace(("handler(" + ec.message() + "): ").c_str());
};
改为打印:
main #1: open
main #2: open
main #3: closed
handler(Success): closed
handler(Bad file descriptor): closed
请注意,也许令人惊讶的是,第一个发送操作仍然成功。与我的预期相反,这表明发送实际上是在
async_send_to
调用时启动的,但完成延迟到io.run()
之后(套接字仍然显示为已经关闭(。
也许你根本不想要异步操作:
住在科里鲁
#include <boost/asio.hpp>
#include <iostream>
using boost::asio::ip::udp;
int main() {
std::cout << std::boolalpha;
boost::asio::io_context io;
boost::asio::ip::udp::socket s {io, udp::v4()};
boost::asio::ip::udp::endpoint const ep {{}, 9999};
auto trace = [&s](char const* caption) { std::cout << caption << s.is_open() << std::endl; };
trace("main #1: ");
char buff[200] = {};
try {
/*size_t wlen =*/ s.send_to(boost::asio::buffer(buff), ep);
trace("sent #1: ");
} catch(boost::system::system_error const& e) {
std::cout << "Send #1 failed: " << e.code().message() << std::endl;
}
trace("main #2: ");
s.close();
try {
/*size_t wlen =*/ s.send_to(boost::asio::buffer(buff), ep);
trace("sent #2: ");
} catch(boost::system::system_error const& e) {
std::cout << "Send #2 failed: " << e.code().message() << std::endl;
}
trace("main #3: ");
s.close();
io.run();
}
指纹
main #1: true
sent #1: true
main #2: true
Send #2 failed: Bad file descriptor
main #3: false
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- -fno-unwind-tables 和 -fno-async-unwind-tables 不起作用 NDK clang
- 包装器到std :: async()不起作用
- std::async in clang 3.0 + libc++ 不起作用?