c++ - 使用 use_future 提升 Asio async_send_to 多播不起作用
问题描述
ITNOA
我有一个程序想要将一条带有 async_send_to 的消息发送到一个多播组。但我想这个动作是阻塞而不是异步的,所以我使用 use_future 来实现这个目标,如下所示
gw::BoostMessageSender::BoostMessageSender(const std::string& group_address, const std::string& interface_name, uint16_t port_number, ba::io_context& io_context)
: AbstractMessageSender(group_address, interface_name, port_number)
, io_context(io_context)
, endpoint(ba::ip::address::from_string(group_address), port_number)
, socket(io_context, endpoint.protocol())
{
if (!socket.is_open())
socket.open(endpoint.protocol());
socket.set_option(ba::ip::udp::socket::reuse_address(true));
}
bool gw::BoostMessageSender::send(const std::string& message) noexcept
{
std::future<std::size_t> result = socket.async_send_to(ba::buffer(message), endpoint, ba::use_future);
return result.get() == message.size();
}
我像下面这样使用这个类
int main()
{
const string group_address = "235.127.1.1";
constexpr uint16_t PORT_NUMBER = 8765;
boost::asio::io_context io_context;
BoostMessageSender message_sender(group_address, "eth1", PORT_NUMBER, io_context);
std::thread t1([&io_context]()
{
io_context.run();
});
this_thread::sleep_for(1s);
message_sender.send("Any bodey there?");
cout << "send message: "; // --- this line is not run never :(((
io_context.stop();
t1.join();
return 0;
}
我的问题是为什么send message
永远不在我的控制台中写入?
更奇怪的是,我tcpdump -i eth0 -nnSX port 8765
在通话后检查了我的网络,async_send_to
我可以看到发送到网络的多播消息,但从result.get()
不返回结果并挂在上面。
我哪里错了?
我在以下平台上测试这些代码
Visual Studio 2019 16.7.4
Windows 10 1909 latest update
Boost 1.73.0
Ubuntu 20.04.1 LTS
GCC 9.3.0
Boost 1.71.0
解决方案
io_context::run
当没有待执行的作业时返回。
您可以创建工作守卫以确保即使没有启动异步任务也不会完成运行。使用make_work_guard
功能:
boost::asio::io_context io_context;
auto workGuard = boost::asio::make_work_guard(io_context);
推荐阅读
- python - 如何从python 3中的文本文件中获取某些值
- c# - Is there any way to change border/header background in VSTO outlook add in?
- dart - StackOverflowError 在构建 FutureBuilder 时被抛出
- >
- java - Spring Integration 2.2.3.RELEASE @ServiceActivator 未调用
- ios - 如何在单个视图上每秒将值增加一个数字(cps)?
- c# - 读取 .txt 文件的最后 5 行并在 C# 控制台应用程序中显示结果
- android - ArCore 和 Firebase Perf 编译错误
- c# - 我的 C# 函数导致 Unity 在播放时冻结
- python - python3,读取解压缩文件内容时出现UnicodeDecodeError
- python - NameError:尝试访问 Google 工作表时未定义名称“工作表”