gpt4 book ai didi

c++ - Boost ASIO 缓冲不工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:04 25 4
gpt4 key购买 nike

我正在编写一个网络应用程序,它使用 ASIO/UDP 在单个远程/本地端点对之间发送和接收。我曾使用 udp::socket::receive 接收数据,我的代码中的所有内容都在逻辑上工作,但我丢失了大量数据包。我发现任何接收到的数据包在没有被接收函数阻塞的情况下都丢失了——它没有缓冲。这特别奇怪,因为我使用以下命令将接收缓冲区设置为 2MB:

sock_udp.connect( remote_endpoint );
sock_udp.set_option( boost::asio::socket_base::receive_buffer_size(2*1024*1024) );

如果我只发送两个数据包,每个数据包大约 100 字节,如果我花时间处理第一个数据包,我仍然会丢失第二个数据包。

我认为这可能是 udp::socket::receive 的一个缺陷,所以我重新编写了我的网络代码以使用 udp::socket::async_receive 但我仍然有相同的问题。也就是说,一旦我的处理程序被调用,我就会丢弃所有数据包,直到我再次调用 async_receive。

我是不是从根本上误解了什么?我应该使用其他方法来 boost 缓冲传入数据包吗?

如果有帮助,我已经验证了这在使用自定义 gcc4.2 构建的 XCode 中的 OS X 以及使用 gcc4.5 的 Ubuntu 10.10 中都会发生。我还没有能够在 Windows 中尝试它。

最佳答案

这里的一般想法是,您的程序应该将大部分时间花在等待套接字传递某些东西上,要么在 UDP 接收中阻塞,要么在 io_service 中等待通知套接字已异步接收到某些东西。套接字在操作系统中隐式地有一个小缓冲区用于接收数据包,没有办法避免它。因此,问题更有可能出在您的程序的行为方式上。

  • 您的线程是否位于 ASIO io_service 之外的任何地方?如果是这样,您很容易溢出任何底层套接字缓冲区。
  • 你能证明平均而言,阻塞调用之间花费的时间少于发送数据包之间的时间吗?
  • 从套接字接收数据后,您必须再次调用 async_receive。例如,您可以从接收处理程序中发出另一个 async_receive。

关于c++ - Boost ASIO 缓冲不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4199008/

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