首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IP_DROP_MEMBERSHIP行为不一致

IP_DROP_MEMBERSHIP行为不一致
EN

Stack Overflow用户
提问于 2018-10-26 12:33:56
回答 1查看 140关注 0票数 0

我有一个用例,其中我使用IP_ADD_MEMBERSHIP加入成员资格,一段时间后,我必须删除( IP_DROP_MEMBERSHIP )(就在drop seq id为1之前),然后再次使用IP_ADD_MEMBERSHIP加入成员资格(针对同一多播组)。我注意到我得到了下一个包(seqid = 2),我认为这不应该发生,因为根据我的理解,IP_DROP_MEMBERSHIP应该停止接收udp包并刷新它正在使用的套接字,一旦我重新加入,它应该是最新的可用的包,并且这种行为并不一致,有时我只得到最新的包。

请注意,我不希望关闭插座。继续使用现有版本。

请帮帮忙。我使用的是Centos 7.4

EN

回答 1

Stack Overflow用户

发布于 2018-10-27 07:48:42

尝试将IP_MULTICAST_ALL设置为0。默认为1。

说明:使用UDP 0,您的操作系统会将传入的IP_MULTICAST_ALL数据包过滤到您当前加入的组中,这是您在描述中所期望的。

但这不是Linux上的默认行为。

默认情况下(使用IP_MULTICAST_ALL=1)是接收进入套接字的任何UDP数据包。当您绑定到0.0.0.0时,这将是机器为该端口、多播和单播接收的所有UDP数据包,无论您是否加入任何多播组。这意味着您将看到加入和离开多播组之间的差异以及您的计算机发送的实际IGMP消息的所有伪像,您还将看到本地网络中所有路由器和交换机的所有伪像和错误。例如,当您离开多播组时,您的操作系统可能会决定根本不发送相应的IGMP消息,例如,因为某个其他套接字也在侦听此多播地址,或者因为操作系统决定延迟离开。这一切都是完全允许的。

顺便说一句,当你在Linux上绑定组播地址时,这只有一个过滤功能,而没有任何绑定功能。然后,您将只接收以该特定组播IP为目标的UDP数据包,而不管您是否也加入了其他组播组。

关于“刷新”套接字:套接字后面的数据包队列完全超出了您的应用程序的范围。您不能影响队列状态或行为(除了是否从队列中读取),也不能期望任何特定的行为。

在实践中,我建议:-绑定到0.0.0.0。-适当地加入和离开多播组。-检查您收到的每个UDP数据包的目标地址,并自己进行任何过滤。使用IP_PKTINFO获取每个数据包的目的地址。-完全不依赖于具有任何明显和确定的多播路由行为的路由器和交换机。它们中的大多数在离开多播组时都有很长的超时时间。这意味着,即使您离开了多播组(甚至当您没有加入多播组时),您也可能会在几分钟内继续接收多播流量。这会掩盖代码中的bug,并且会在尝试调试代码时带来麻烦。

通过这种方式,您将不必依赖于任何依赖于操作系统的行为,并且您可以完全控制接收的内容和不接收的内容。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53001477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档