【问题标题】:Missing multicast messages in Windows 2008 R2Windows 2008 R2 中缺少多播消息
【发布时间】:2015-05-04 14:06:22
【问题描述】:

我有几个应用程序通过多个通道发送多播消息。大多数频道每秒发布数千条消息。我遇到问题的频道(尽管它可能也会影响其他频道)每分钟发布大约 8k 条消息。大多数时候,所有的消息都会到达。有时,应用层缺少一些或许多,但 Wireshark 会捕获它们(排除网络/发送问题)。我不相信这是应用程序,原因有两个:1) 我有两个完全独立的应用程序正在运行,一个用 C++ 编写,另一个用 C# 编写,没有共享代码。两个应用程序总是接收/错过相同数量的消息。 2) 这两个相同的应用程序,当它们在发布的同一台服务器上运行时,不会错过任何消息。因此,NIC 和应用程序(即操作系统)之间似乎有些不对劲。网络和 CPU 利用率可以忽略不计 (~5%)。

我们已应用此处描述的补丁,http://support.microsoft.com/kb/2639824,但没有成功。

任何想法将不胜感激。

【问题讨论】:

  • windows 可以在不通知应用程序的情况下丢弃 UDP 包。您可以尝试增加缓冲区大小、单独读取线程等。但是如果所有这些都不起作用,您可以使用 winpcap 来捕获您的多播流,就像 wireshark 正在使用的那样......
  • 我已经在使用一个大缓冲区,大到足以捕获所有消息。我在我的 C++ 应用程序中使用 IOCP,而 C#(我认为)在幕后使用它。 C# 应用程序将数据复制到缓冲区(来自 byte[] 池)并将其推送到队列中以供另一个线程处理)。所以,更多的线程将无济于事。没用过winpcap。这似乎是一种绕过操作系统的方法。对吗?
  • 是的,使用 winpcap 将绕过操作系统。请注意,您仍然需要操作系统来订阅多播流。

标签: c++ windows multicast packets


【解决方案1】:

经过进一步研究,找到了解决方案。首先,我发现我的一个假设(Wireshark 看到了数据包而我的应用程序没有看到)被证明是错误的。由于 Wireshark 也丢失了数据包,因此问题必须存在于上游,从 NIC 开始。在网卡上禁用中断审核后,问题就解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2011-09-22
    • 2011-01-04
    • 2015-11-14
    相关资源
    最近更新 更多