多播基础-丢失数据

multicast basics - lost data

本文关键字:数据 多播      更新时间:2023-10-16

如果您的应用程序不处理,这是读取多播数据的基本原则吗下一个数据报在另一个数据报进入之前第一个数据报本质上是覆盖?我做了一些实验,增加receive_buffer大小没有效果我所描述的。换句话说,似乎没有windows操作系统或网卡软件对多播数据报进行低级排队。

我理解对了吗?或者有一些套接字选项或控制可以帮助解决这个问题?

Windows XP有一个8KB的默认套接字缓冲区,Vista和更高版本有一个64KB的默认套接字缓冲区。你可以用SO_RCVBUF覆盖这个,当使用IOCP时,建议不要像SO_SNDBUF那样设置为0。

通常使用套接字缓冲区时,队列会被填满并开始丢弃新数据包,因此使用大缓冲区时,可能会导致缓冲区中等待的过时消息优先于更新的新数据。

您需要遵循的设计是一个紧循环中的高优先级线程,尽可能快地从网络读取数据包,并在业务逻辑较慢时插入更大的应用程序队列以供稍后处理。当使用IOCP时,你可以发布几个阻塞recv调用,以尽量减少数据丢失,但正如MSDN文档所述,在完成端口的完成顺序上没有保证。

如果多播指的是UDP,那么在使用协议时无法保证数据排序甚至数据到达。

如果你正在内联处理收到的数据包,那么你肯定会错过传入的数据,而这样做,应该考虑把每个数据包交给一个单独的线程处理,这样你就可以尽快发布另一个接收。这将在协议和特定网络配置的约束下最大限度地减少数据丢失。