Слушайте трансляцию UDP на определенном интерфейсе в Python - PullRequest
0 голосов
/ 24 октября 2019

Я хотел бы прослушивать пакеты, которые транслируются по сети (например, порт 138 на 192.168.0.255), но я хочу слушать только на определенном интерфейсе. Например, если у меня есть два IP-адреса: 192.168.0.2 (eth1) и 172.16.0.2 (eth2), я просто хочу привязать свой сокет к eth1, а не к eth2.

Я нашел способ сделатьчто при прослушивании ВСЕХ интерфейсов с магическим адресом «0.0.0.0».

    def _create_socket(self, port):
        """ Create a socket listening on the given port """
        # Create an IPv4/UDP socket
        soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

        # Avoid error "Address already in use"
        soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

        # Listen broadcast packets on all interfaces
        soc.bind(('0.0.0.0', port))

        return soc

Однако я хотел бы сосредоточиться на конкретном интерфейсе, поэтому я попробовал некоторые решения, которые не работают:

  • Сначала попробуйте связать по широковещательному адресу:
  soc.bind(('192.168.0.255', port))

Но я получил ошибку: socket.error: [Errno 10049] The requested address is not valid in its context

  • Затем попробуйтедля привязки к моему IP-адресу в сети:
  soc.bind(('192.168.0.2', port))

Но я получил ошибку: socket.error: [Errno 10013] An attempt was made to access a socket in a way forbidden by its access permissions

Может кто-нибудь помочь мне с этой проблемой? Я читал в некоторых местах, что это невозможно с Windows, кто-нибудь может подтвердить это?

Я работаю с Python 2.7.

Большое спасибо за вашу помощь, ура

Как привязать сокет к интерфейсу в python (отсутствует socket.SO_BINDTODEVICE)

Использование специального сетевого интерфейса для сокета в windows

EDIT:

После некоторого исследования кажется, что системный процесс (PID 4) тоже прослушивает 192.168.0.2:138, и это является причиной проблемы. Решением было бы установить для SO_REUSEPORT значение True, но это не доступно в Windows, поэтому я думаю, что нет решения об этом ...

...