Как узнать, с какого интерфейса я получил многоадресный пакет?

У меня есть один сокет, ожидающий пакетов приветствия OSPF (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)

Дело в том, что мне нужно знать, через какой интерфейс я получил пакет, потому что обработка пакета отличается.

Как узнать, с какого интерфейса я получил многоадресный пакет?

EDIT: из Получение IP-адреса интерфейса, получившего UDP-пакет recvfrom() (Microsoft) здесь "нет никакого способа узнать IP-адрес получателя, когда один прослушивающий сокет привязан к нескольким IP-адресам. (...) создайте отдельный сокет прослушивания для каждого IP-адреса». Кто-нибудь знает другое решение?


person André Pires    schedule 31.10.2017    source источник
comment
Посмотрите на исходный адрес в IP-пакете. Это будет адрес маршрутизатора-отправителя, который должен находиться в сети одного из ваших интерфейсов. Многоадресная рассылка OSPF — это многоадресная рассылка, локальная для канала, что означает, что она не может быть отправлена ​​по локальной ссылке, поэтому адрес источника будет в той же сети, что и один из ваших интерфейсов. Пакеты приветствия OSPF также содержат IP-адрес и сетевую маску отправляющего маршрутизатора.   -  person Ron Maupin    schedule 31.10.2017
comment
Отличная идея! Спасибо @RonMaupin   -  person André Pires    schedule 31.10.2017