Я пишу это с точки зрения Linux, но я предполагаю, что это применимо везде.
Решение принимается, когда сокет связан.Когда вызывается bind
, указанный вами адрес определяет интерфейс, который будет прослушивать сокет.(Или даже все интерфейсы.)
Даже если вы не используете bind
, это происходит неявно, когда вы connect
.Пункт назначения ищется в таблице маршрутов, которая должна содержать маршрут к сети пункта назначения.Маршрут также содержит используемый интерфейс и может дополнительно указывать адрес источника.Если адрес источника не указан, используется основной адрес интерфейса.
Вы можете фактически использовать bind
вместе с connect
, чтобы заставить ваше исходящее соединение использовать определенноеадрес и порт.Сокет должен всегда иметь эти два бита информации, поэтому, даже если вы этого не сделаете, используется первичный адрес и выбирается случайный порт.