Какой исходный IP-адрес в tcp-сокете, если bind
вызывается на многосетевом клиентском хосте? Клиент имеет два интерфейса eth0(IP0)
и eth1(IP1)
, а клиентский сокет tcp привязан к IP0
. После socket, bind, connect
в клиенте он отправляет пакет на сервер. IP-адрес назначения servIP
. Но servIP
и IP0
не находятся в одной подсети (возможно, servIP
и IP1
). Какой исходный IP-адрес в пакете, отправленном на сервер? А что вернет getsockname
?
исходный IP-адрес на многосетевом клиентском хосте во время вызова привязки
Ответы (1)
Здесь есть две отдельные проблемы:
1) На какой IP привязываться?
При вызове bind() у вас есть возможность указать и адрес для привязки, или вы можете оставить это решение для стека TCP/IP на вашем компьютере. Вы можете передать конкретный адрес в параметре «addr» или оставить его как INADDR_ANY. Дополнительную информацию о том, как это сделать, можно найти на странице руководства ip(7) а>. Если вы вызываете bind(), предоставляя действительный IP-адрес, и вызов bind() завершается успешно, то дейтаграммы, отправленные с использованием привязанного сокета, будут иметь исходный адрес, установленный на значение, предоставленное при вызове bind().
2) Как маршрутизируется пакет?
Способ маршрутизации вашего пакета зависит только от адреса назначения, а не от адреса источника. Может случиться так, что ваш исходный адрес будет адресом от eth0, а он будет выходить через eht1. Это связано с тем, что система маршрутизации в вашей ОС использует маршрутизацию на основе пункта назначения, а не маршрутизацию на основе источника. Вы всегда можете увидеть, какой адаптер будет использоваться, введя команду «route» в консоли вашей ОС и сравнив вывод с адресом назначения.