Я хотел бы прослушивать пакеты, которые транслируются по сети (например, порт 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, поэтому я думаю, что нет решения об этом ...