Как создать исходящий сокет для сетевого интерфейса SPECIFIC?
У меня есть сервер с двумя разными сетевыми интерфейсами, каждый с другим IP-адресом. Как создать сокет, чтобы он выходил за определенный IP-адрес?
Я бы предпочел пример python, но вопрос - язык агностик, поэтому отстреляйтесь.
РЕДАКТИРОВАТЬ: Пожалуйста, не дайте мне "Вы не можете" в качестве ответа. Я имею в виду, это компьютер. Например, я могу делать все, что мне нравится, - я могу программно отключить один интерфейс, который мне не нужен на лету. Я ищу что-то красивое.
Ответы
Ответ 1
Конечно, вы можете привязать сокет к определенному устройству.
Я не знаю, как это сделать в python, но с использованием berkeley socket api (в C) вам нужно вызвать setsockopt()
, используя опцию SO_BINDTODEVICE
.
Вы передаете дескриптор интерфейса, который имеет тип struct ifreq
. В идеале вы получите содержимое дескриптора интерфейса, используя ioctl()
и запросив SIOCGIFINDEX
- передав имя интерфейса (например, eth0) в качестве аргумента.
edit: просто сделал быстрый поиск и нашел эту документацию о методах сокета в python. setsockopt()
находится среди них.
Ответ 2
Просто небольшая заметка - мне действительно нужно привязываться к определенному IP-адресу, и только ради полноты решения необходимо связать сокет после создания. Источник в python:
import socket
s = socket.socket()
s.bind(("127.0.0.1", 0))
s.connect(("321.12.131.432", 80))
Ответ 3
import socket
s = socket.socket()
s.bind((get_ip_address('eth0'), 0))
из Quora