gpt4 book ai didi

c++ - 为什么这个例子使用 ASIO async_receive_from 而不是 "leaky"

转载 作者:行者123 更新时间:2023-11-30 02:49:52 26 4
gpt4 key购买 nike

基本上:

  void start_receive()
{
socket_.async_receive_from(
boost::asio::buffer(recv_buffer_), remote_endpoint_,
boost::bind(&udp_server::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}

void handle_receive(const boost::system::error_code& error,
std::size_t /*bytes_transferred*/)
{
if (!error || error == boost::asio::error::message_size)
{
boost::shared_ptr<std::string> message(
new std::string(make_daytime_string()));

socket_.async_send_to(boost::asio::buffer(*message), remote_endpoint_,
boost::bind(&udp_server::handle_send, this, message,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));

start_receive();
}
}

来自: http://www.boost.org/doc/libs/1_35_0/doc/html/boost_asio/tutorial/tutdaytime6/src.html

根据我的理解,start_recive 注册了 handle_recive,然后 handle_receive 如果一切正常,调用时再次调用 start_receive重新注册,然后重复。我不明白的是,数据是否有可能在调用 handle_receive 和 handle_receive 再次调用 start_receive 之间滑动......

最佳答案

这在技术上是可行的,但对于 udp_server 示例在非饱和条件下不太可能发生。

尽管 Boost.Asio 在套接字上可能没有任何挂起的读取操作,但操作系统的网络堆栈会将接收到的数据排队到内核内存中。 Boost.Asio 的异步操作使用一个 react 堆,当网络堆栈有数据可供在给定套接字上读取时得到通知。处理完此通知后,Boost.Asio 将启动从套接字读取数据,从而将数据从网络堆栈的内核内存复制到提供的用户内存中。

内核的网络堆栈和套接字通常有一个可配置的参数来控制它们的最大缓冲区大小。例如,receive_buffer_size socket 选项,Windows registry , 或 Linux sysctl .由于此内存限制和 UDP 无法保证交付,如果数据报的消耗(读取)速度低于生成(接收)的速度,则网络堆栈可能会丢弃数据报。

关于c++ - 为什么这个例子使用 ASIO async_receive_from 而不是 "leaky",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20879797/

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