c++ - 根据 boost 1.68 的文档,不推荐使用旧的 io_context::post 。推荐使用 boost::asio::post()。谁能给我一个例子?
问题描述
我想使用 asio::io_context::post 的功能。但我发现它被标记为已弃用
你可以在这里看到它 (不推荐使用:使用 boost::asio::post()。)请求 io_context 调用给定的处理程序并立即返回。
然后我想尝试一下 boost::asio::post(),但我无法想象如何编写代码。没有示例,没有代码,甚至没有更多文档。
你能帮助我吗?非常感谢。
解决方案
我有一个使用 boost.asio 的 RTSP 服务器的真实示例:
using udp_buffer = std::array<char, 0xFFFF>;
using shared_udp_socket = std::tuple<boost::asio::ip::udp::socket,
boost::asio::io_context::strand,
udp_buffer,
boost::asio::ip::udp::endpoint>;
void rtsp::rtsp_server::handle_incoming_udp_traffic(const boost::system::error_code &error,
std::size_t received_bytes,
rtsp::rtsp_server::shared_udp_socket &incoming_socket) {
if (error)
throw std::runtime_error{error.message()};
auto data = std::make_shared<std::vector<char>>();
std::copy_n(std::get<2>(incoming_socket).cbegin(), received_bytes, std::back_inserter(*data));
boost::asio::ip::udp::endpoint received_from_endpoint = std::get<3>(incoming_socket);
boost::asio::post(std::get<1>(incoming_socket).get_io_context(),
std::bind(&rtsp::rtsp_server::handle_new_incoming_message,
data, std::ref(incoming_socket),
received_from_endpoint,
std::ref(this->server_state_))
);
start_async_receive(incoming_socket);
}
void rtsp::rtsp_server::handle_new_incoming_message(std::shared_ptr<std::vector<char>> message,
shared_udp_socket &socket_received_from,
boost::asio::ip::udp::endpoint received_from_endpoint,
server::rtsp_server_state &server_state {...}
在那里,您可以看到我如何使用boost::asio::post
将传入 UDP 数据报的处理发布到 iocontext,同时开始重新监听 udp 套接字上的新传入数据报start_async_receive
。如果您需要进一步的解释,请告诉我。
推荐阅读
- url - Internet Shortcut .URL 文件中的内嵌图像?
- ios - 如何为视图生命周期事件(onAppear、onDisappear)制作可重用的修饰符?
- python - 熊猫翻滚几天并得到总和
- gps - 卡尔曼滤波 - 纬度经度需要转换为米?
- c++ - 一段时间后,我的主线程随机停止执行代码?
- typescript - 从 swagger yml 文件生成 Typescript `d.ts` 文件
- c - Valgrind C/C++ 在堆栈外使用的堆栈分配创建的统一值
- c# - 比较颜色 Toargb
- python - selenium.common.exceptions.TimeoutException:消息:超时等待页面通过 Selenium 使用 IEDriverServer 和 Internet Explorer 加载
- xcode - xcode clang:错误:没有这样的文件或目录:'密码箱'