如果您的应用程序不处理,这是读取多播数据的基本原则吗? 在另一个数据报出现之前,下一个数据报出现在第一个数据报中 覆盖?我做了一些实验,增加receive_buffer大小没有效果 在我所描述的。换句话说,Windows操作系统或NIC卡软件似乎没有低级别的多播数据报排队。
我是否理解正确?或者是否有一些套接字选项或控件可以帮助解决这个问题?
答案 0 :(得分:1)
如果通过多播表示UDP,那么在使用协议时无法保证数据排序甚至数据到达。
如果您正在处理收到的内联数据包,那么在执行此操作时您肯定会错过传入的数据,并应考虑将每个数据包交给单独的线程进行处理,以便您可以尽快发布另一个接收数据。这样可以最大限度地减少协议和特定网络配置约束内的数据丢失。
答案 1 :(得分:1)
Windows XP有一个8KB的默认套接字缓冲区,Vista和后来有一个64KB的默认套接字缓冲区。您可以使用SO_RCVBUF
覆盖此值,建议在使用IOCP时,不要将SO_SNDBUF
设置为零以进行零拷贝。
通常使用套接字缓冲区,队列会填满并开始丢弃新的数据包,因此使用大缓冲区时,最终可能会在缓冲区中等待过时的过时消息优先于新的新数据。
您需要遵循的设计是紧密循环中的高优先级线程,尽可能快地从网络读取数据包并插入更大的应用程序队列,以便在业务逻辑较慢时进行后续处理。使用IOCP时,您可以发布多个阻塞recv
调用以最大限度地减少数据丢失,但正如MSDN文档所述,无法保证完成端口上的完成顺序。