【问题标题】:Boost ASIO Buffering Not WorkingBoost ASIO 缓冲不起作用
【发布时间】:2010-11-16 21:11:25
【问题描述】:

我正在编写一个网络应用程序,它使用 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。

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

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

【问题讨论】:

  • 也许您可以发布一个更完整的示例,从您的描述中很难说出可能有什么问题,我已经将boost::asio::async_read 与 udp 套接字一起使用,并且丢弃数据包没有问题...
  • 正如 Nim 所说,您应该发布更多代码,以便我们更好地了解您的程序的结构。

标签: c++ boost network-programming udp boost-asio


【解决方案1】:

这里的总体思路是,您的程序应该花费大部分时间在套接字上等待传递某些内容,或者在 UDP 接收中被阻塞,或者在 io_service 中等待套接字已异步接收到某些内容的通知。套接字在操作系统中隐含地有一个小缓冲区用于接收数据包,没有办法避免它。所以问题更可能在于您的程序的行为方式。

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

【讨论】:

  • 我将其标记为答案的原因是错误结果是 PEBKAC 错误(键盘和椅子之间存在问题)。代码的某些部分是在不同的线程中完成的,当数据到达太快时,我写得太多了。我在尝试提出一个简短示例时发现了这一点 - 该示例没有出现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2010-11-14
  • 2016-09-19
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
相关资源
最近更新 更多