Подтвердить что ты не робот

Как создать исходящий сокет для сетевого интерфейса SPECIFIC?

У меня есть сервер с двумя разными сетевыми интерфейсами, каждый с другим IP-адресом. Как создать сокет, чтобы он выходил за определенный IP-адрес?

Я бы предпочел пример python, но вопрос - язык агностик, поэтому отстреляйтесь.

РЕДАКТИРОВАТЬ: Пожалуйста, не дайте мне "Вы не можете" в качестве ответа. Я имею в виду, это компьютер. Например, я могу делать все, что мне нравится, - я могу программно отключить один интерфейс, который мне не нужен на лету. Я ищу что-то красивое.

4b9b3361

Ответ 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