【发布时间】: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