Как мне сделать исходящий сокет для конкретного сетевого интерфейса? - PullRequest
21 голосов
/ 03 декабря 2008

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

Я бы предпочел пример с питоном, но вопрос не зависит от языка, так что отбросьте.

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

Ответы [ 3 ]

14 голосов
/ 03 декабря 2008

Разумеется, вы можете привязать сокет к определенному устройству.

Я не знаю, как это сделать на python, но, используя api-сокет berkeley (в C), вам нужно вызвать setsockopt(), используя опцию SO_BINDTODEVICE.

Вы передаете дескриптор интерфейса, который имеет тип struct ifreq. В идеале вы должны получить содержимое дескриптора интерфейса, используя ioctl() и запрашивая SIOCGIFINDEX - передавая имя интерфейса (например, eth0) в качестве аргумента.


edit: только что сделал быстрый поиск и нашел эту документацию по методам сокетов в python. setsockopt() среди них.

12 голосов
/ 20 марта 2009

Небольшое замечание - что мне действительно нужно, так это привязать к определенному IP-адресу, и просто ради полноты, решение состоит в том, чтобы связать сокет после создания. Источник на питоне:

import socket
s = socket.socket()
s.bind(("127.0.0.1", 0))
s.connect(("321.12.131.432", 80))
2 голосов
/ 11 августа 2015
import socket
s = socket.socket()
s.bind((get_ip_address('eth0'), 0))

из Quora

...