IP-адрес, когда задействованы несколько сетевых адаптеров - PullRequest
2 голосов
/ 15 марта 2012

Я пишу приложение на сервере TCP, используя Winsock. Машина, на которой будет работать мой сервер, и машина, на которой будет работать клиент, имеют 2 сетевых адаптера. Используемые IP-адреса:

  • Сервер NIC 1: 192.168.132.14 <- это тот, который я хочу связать </li>
  • Сервер NIC 2: 192.168.132.15
  • Клиент NIC 1: 192.168.132.16
  • Клиент NIC 2: 192.168.132.17

ВОПРОС 1: В моем серверном приложении, если я буду использовать INADDR_ANY при привязке моего прослушивающего сокета, какой из двух моих IP-адресов будет использоваться? Правильно ли будет предположить, что ничего не сказано и что я должен просто использовать inet_addr ("192.168.132.14") вместо INADDR_ANY?

ВОПРОС 2: Как клиент может контролировать, какой IP-адрес он использует при подключении ко мне? Будет ли он просто вызвать bind () перед вызовом connect ()? Должен ли я видеть, что он подключается с любого адреса (не сообщая с какого), если он этого не делает?

1 Ответ

7 голосов
/ 16 марта 2012

При вызове listen() на сокете сервера привязка к INADDR_ANY свяжет сокет со всеми доступными локальными IP-адресами на машине.Это позволяет клиенту подключаться к любому из IP-адресов сервера.Если вместо этого сервер использует inet_addr(), это будет единственный IP-адрес, на котором сервер может принимать клиентские подключения.

При вызове connect() в клиентском сокете он должен указать конкретный IP-адрес, который серверслушает дальше.Если клиент хочет выбрать, к какому локальному IP он привязывается для своей конечной точки соединения, он может вызвать bind() сам по себе перед вызовом connect().Если клиент не связывается с конкретным IP-адресом или связывается с INADDR_ANY, сокет будет использовать первый обнаруженный им IP-адрес, к которому имеется доступный маршрут к IP-адресу сервера, к которому выполняется подключение.

После подключениябыло установлено, что обе стороны могут в любое время вызвать getsockname() и getpeername() на своих соответствующих конечных точках сокетов, чтобы выяснить, какие IP-адреса (и порты) фактически используются для этого соединения.

...