首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >增强ASIO缓冲不起作用

增强ASIO缓冲不起作用
EN

Stack Overflow用户
提问于 2010-11-17 05:11:26
回答 1查看 2K关注 0票数 4

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

代码语言:javascript
复制
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来缓冲传入的数据包?

如果它有帮助,我已经验证了这在XCode中的OS X中使用自定义的gcc4.2版本,以及在Ubuntu10.10中使用gcc4.5。我还没能在Windows上试用它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-17 10:12:06

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

除了在 io_service中,ASIO

  • 是你的线程吗?如果是这样的话,您可以很容易地使任何基础套接字缓冲区溢出。
  • 您能证明平均而言,阻塞调用之间花费的时间小于发送数据包之间的时间吗?
  • 从套接字接收数据后,您必须再次调用async_receive。例如,您可以从接收处理程序中发出另一个async_receive。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4199008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档