Как сокет узнает, какой контроллер сетевого интерфейса использовать? - PullRequest
46 голосов
/ 28 ноября 2010

Если на компьютере установлено несколько сетевых карт, все они подключены к разным сетям и работают нормально, когда мы открываем сокет, как ОС определяет, какой сетевой адаптер использовать с этим сокетом?Позволяет ли API сокетов явно указывать NIC, который будет использоваться?

Ответы [ 3 ]

51 голосов
/ 28 ноября 2010

Я пишу это с точки зрения Linux, но я предполагаю, что это применимо везде.

Решение принимается, когда сокет связан.Когда вызывается bind, указанный вами адрес определяет интерфейс, который будет прослушивать сокет.(Или даже все интерфейсы.)

Даже если вы не используете bind, это происходит неявно, когда вы connect.Пункт назначения ищется в таблице маршрутов, которая должна содержать маршрут к сети пункта назначения.Маршрут также содержит используемый интерфейс и может дополнительно указывать адрес источника.Если адрес источника не указан, используется основной адрес интерфейса.

Вы можете фактически использовать bind вместе с connect, чтобы заставить ваше исходящее соединение использовать определенноеадрес и порт.Сокет должен всегда иметь эти два бита информации, поэтому, даже если вы этого не сделаете, используется первичный адрес и выбирается случайный порт.

30 голосов
/ 28 ноября 2010

(Если вы склонны голосовать "за", ответ @ Shtéf заслуживает его больше, чем мой.)

Это зависит от того, подключаетесь вы или связываете.

Если вы связываете, выможет связываться с конкретным IP-адресом, соответствующим одному из интерфейсов машины, или вы можете связать с 0.0.0.0, в этом случае сокет будет прослушивать все интерфейсы.

Если вы подключите несвязанный сокет, тоТаблицы маршрутизации машины в сочетании с IP-адресом назначения будут определять, на каком интерфейсе будет отправлен запрос на подключение.

Возможно связать сокет и подключить его.В этом случае сокет останется связанным согласно вызову связывания, когда это делает соединение.(Спасибо @RemyLebeau за это.)

0 голосов
/ 24 мая 2013

Я не совсем уверен, какой метод является лучшим, но есть альтернативная теория для подхода bind () - before-connect (), который представил Штеф.Это использовать setsockopt () с SO_BINDTODEVICE.Смотри: http://codingrelic.geekhold.com/2009/10/code-snippet-sobindtodevice.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...