Что означает связать() сокет с любым адресом, отличным от localhost?

Я не понимаю, что значит bind сокет к любому адресу, кроме 127.0.0.1 (или :: 1 и т.д.).
Разве я не по определению - привязываю сокет к порту на моей собственной машине.. который является localhost?
Какой смысл это сделать, чтобы связать или прослушать другой компьютер или порт IP-адреса?
Понятно, что это просто не имеет смысла для меня!

(Это оказалось на удивление сложным для Google... возможно, потому что я не согласен с правильными условиями.)

Ответ 1

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

Обычно есть несколько интерфейсов на конкретной машине, то есть петля псевдоинтерфейса, где машина может достигнуть себя, Ethernet, WLAN, VPN.... Каждому из этих интерфейсов может быть назначено несколько IP-адресов. Например, loopback обычно имеет 127.0.0.1 и с IPv6 также :: 1, но вы также можете назначать другие. Ethernet или WLAN имеют IP-адреса в локальной сети, т.е. 172.16.0.34 или что-то еще.

Если вы привязываете сокет для получения данных к определенному адресу, вы можете получать только данные, отправленные на этот конкретный IP-адрес. Например, если вы привязываетесь к 127.0.0.1, вы сможете получать данные из вашей собственной системы, но не из какой-либо другой системы в локальной сети, потому что они не могут отправлять данные на вашу 127.0.0.1: для одной любые данные на 127.0. 0.1 будет отправлено на их собственный 127.0.0.1, а во-вторых, ваш 127.0.0.1 - это адрес вашего внутреннего интерфейса обратной связи, который недоступен извне.

Вы также можете привязать сокет к универсальному адресу, например 0.0.0.0 (Ipv4) и :: (Ipv6). В этом случае он не привязан к определенному IP-адресу, но сможет получать данные, отправленные на любой IP-адрес устройства.