在一个套接字上从多个组接收多播流量时遇到问题

时间:2019-06-29 08:41:02

标签: c sockets multicast igmp

我正在使用C语言开发一个应用程序,该应用程序在一个套接字上侦听多个多播组。我正在禁用套接字选项:IP_MULTICAST_ALL。 套接字正在接收来自20个不同的多播组的流量。此流量以突发方式到达套接字。这些通道之一仅每秒发布一条消息,并且这里没有发现问题。

对于这个多播提要,我也有一个可靠的协议。如果一个侦听器错过了一条消息,则协议会尝试通过消息与源进行对话来恢复消息,然后通过与通常相同的通道进行重传。

当有消息突发到达套接字时,问题就会出现,然后RUDP协议强制重新传输这些消息。消息到达时没有问题,但是如果消息突发组由于没有更多流量要发送而停止重新传输新数据,则有时(很容易重现),套接字不会从这些消息中读取那些未决的传入消息如果定期消息来自其他组(流量很小,流量很小且周期性的消息)到达,则将其分组。 到目前为止的情况是,有许多传入的消息之前发送过,等待应用程序读取(没有更多数据通过此组发送),而周期性的消息则是从另一个周期性发送少量消息的组到达的。 / p>

我在这里看到的是应用程序从该组中读取一条消息,该组定期发送一些消息,然后从其他组(突发组)中读取一批消息。套接字配置为非阻塞,每次从套接字读取一批消息时,我都会得到EAGAIN errno,然后没有更多数据要读取,直到套接字从周期组中收到新消息,然后读取此消息以及来自其他组的一批其他待处理消息(应用程序仅从一个套接字读取)。我确保其他组不会产生更多数据,因为我测试了停止其他进程以发送更多数据。因此,这些组上的所有待处理邮件均已发送。

最令人惊讶的事实是,如果我阻止写入周期组的进程发送更多消息,那么侦听器套接字就会神奇地从之前发布过大量消息的组中获取所有待处理的流量。就像周期性组的流量以某种方式停止一样,来自未发布新数据但有大量缓冲区的组的流量的处理。

起初,我认为它与IGMP或轮询机制有关(我的应用程序可以执行主动等待或阻止等待)。阻塞等待是通过非阻塞套接字实现的,但是如果将errno设置为EAGAIN,则应用程序将等待轮询以获取新消息。在两种情况下,我都会得到相同的行为。 我不认为这是IGMP,因为IGMP_SNOOPING在交换机中处于关闭状态,并且因为我在所有进程之间的所有通信中都使用一台计算机环回来重现相同的行为。

我还使用内核旁路技术(不使用内核API来处理网络)重现此行为,因此它似乎与TCP / IP堆栈无关。使用内核旁路技术,我有一个相同的范例:一个消息接口,可从所有组中获取所有流量。在这种情况下,所有进程都使用此机制进行通信,而不是几个TCP / IP和几个内核旁路。该模型是均匀的。

当我收到来自多个组的实时流量时,我只接收成批的消息(但不是全部),但是如果我停止了来自不同组播组的定期流量,那么我将接收所有未决的流量吗? 。这个周期性的流量组每秒只有一条消息。突发组不再发布,因为所有消息都已经发布。

请,有人知道下一步该怎么检查吗?

0 个答案:

没有答案