gpt4 book ai didi

c++ - 使用use_future的Boost Asio async_send_to多播不起作用

转载 作者:行者123 更新时间:2023-12-02 10:26:50 26 4
gpt4 key购买 nike

ITNOA
我有想要将带有async_send_to的消息发送到一个多播组的程序。但是我想这个 Action 阻止了异步,所以我使用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);

关于c++ - 使用use_future的Boost Asio async_send_to多播不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64061131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com