如何判断组播数据包到达哪个接口?

问题描述 投票:0回答:1

我的机器的不同接口(环回接口除外)上有一个套接字正在等待 OSPF Hello 数据包 (224.0.0.5)。此时,我从同一套接字上的两个不同接口接收多播 OSPF 数据包。

class mcast(object):
    def __init__(self):
        self.bufsize = BUFSIZE

    def create(self, MCAST_GROUP, PROTO):
        self.mcast_group = MCAST_GROUP
        self.proto = PROTO
        s = socket(AF_INET, SOCK_RAW, self.proto)
        s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        s.bind((self.mcast_group, self.proto))
        netinterfaces = getIPAllInterfaces().items()
        for x in range(0, len(netinterfaces)):
            if netinterfaces[x][0] == 'lo':
                continue
            else:
                mcast = inet_aton(self.mcast_group) + inet_aton(netinterfaces[x][1])
                s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, str(mcast))
        return s

    def recv(self, s):
        self.s = s
        return self.s.recvfrom(self.bufsize)

现在的重点是我需要知道我在哪个接口接收到数据包,因为数据包的处理方式不同。

如何知道我是从哪个接口收到组播数据包的?

编辑:来自获取接收recvfrom() UDP数据包的接口的IP (Microsoft) 这里“当单个监听套接字绑定到多个IP时,无法知道接收IP。(...)为每个IP创建一个单独的监听套接字。”有人知道不同的解决方案吗?

python linux sockets network-programming ospf
1个回答
0
投票

虽然这是一个7年前的问题,但却是一个相对常见的问题。

Linux支持

IP_PKTINFO
IPV6_PKTINFO
选项,可以使用
setsockopt()

进行设置

当您使用

recvmsg()
而不是普通的recv[from]()时,您将能够读取包含数据包元数据和数据的多部分“消息”。如果设置了上述选项,则消息的
.msg_control
“辅助数据”部分之一将包含
struct in_pktinfo
in6_pktinfo
结构,其中包含入口接口的数字索引。

更多信息:

© www.soinside.com 2019 - 2024. All rights reserved.