多播基础-丢失数据
multicast basics - lost data
如果您的应用程序不处理,这是读取多播数据的基本原则吗下一个数据报在另一个数据报进入之前第一个数据报本质上是覆盖?我做了一些实验,增加receive_buffer大小没有效果我所描述的。换句话说,似乎没有windows操作系统或网卡软件对多播数据报进行低级排队。
我理解对了吗?或者有一些套接字选项或控制可以帮助解决这个问题?
Windows XP有一个8KB的默认套接字缓冲区,Vista和更高版本有一个64KB的默认套接字缓冲区。你可以用SO_RCVBUF
覆盖这个,当使用IOCP时,建议不要像SO_SNDBUF
那样设置为0。
通常使用套接字缓冲区时,队列会被填满并开始丢弃新数据包,因此使用大缓冲区时,可能会导致缓冲区中等待的过时消息优先于更新的新数据。
您需要遵循的设计是一个紧循环中的高优先级线程,尽可能快地从网络读取数据包,并在业务逻辑较慢时插入更大的应用程序队列以供稍后处理。当使用IOCP时,你可以发布几个阻塞recv
调用,以尽量减少数据丢失,但正如MSDN文档所述,在完成端口的完成顺序上没有保证。
如果多播指的是UDP,那么在使用协议时无法保证数据排序甚至数据到达。
如果你正在内联处理收到的数据包,那么你肯定会错过传入的数据,而这样做,应该考虑把每个数据包交给一个单独的线程处理,这样你就可以尽快发布另一个接收。这将在协议和特定网络配置的约束下最大限度地减少数据丢失。
相关文章:
- 如何使用虚幻引擎"filter"多播?
- 无法在 Windows 10 上加入 IPV6 多播组
- 如何在 Linux 上的 C/C++ 中使用 ipv6 udp 套接字进行多播?
- IPv6 多播在局域网中不起作用
- 简单的多播应用程序无法在同一网络上的不同计算机上运行
- Linux VS Windows 上的 UDP 多播差异
- 在覆盆子Pi路由器上进行多播
- C 在特定接口上接收多播
- 为什么Zeromq PGM多播未接收多播消息?(C ,Windows)
- Ubuntu C 多播双休假组消息
- 如何从已经订阅的组中接收多播数据包
- 我是否需要2个插座来进行多播和单播
- 使用 Boost ASIO 在 macOS 上到特定接口的多播
- 如何正确接收多播UDP数据包
- 具有Boost C 的多播接收器看不到数据
- UDP插座(多播)未接收数据(Ubuntu)
- 多播大数据包包含多个客户端的所有信息,而单个数据包则包含目标客户端的信息
- 以最低的延迟从linux中的多播套接字接收数据
- 如何使多播套接字不接收单播数据?
- 多播基础-丢失数据