При создании сокет-приложения сокет нужно биндить к адресу и порту. Если с портом все понятно - машина должна понимать, какому именно приложению отдавать пришедший пакет данных - то с адресом не очень. Зачем указывать адрес сокета для приложения, если приложение итак находится на машине, имеющей свой адрес. Кроме того, часто в процессе изучения я часто замечал, что даже при деплое сетевого приложения сокет биндится к адресу аналога 127.0.01. Для чего это?
То есть фактически вместо localhost я могу привязать сокет и к адресу сетевого адаптера в моей локальной сети, устаговленного в моей машине? Скажем, к 192.168.0.100?
SKEPTIC, Ну конечно да, да и в ядре есть ограничение, но например получить тачку с 32 сетевухами реально - если заморочиться (четырехпортовые сетевухи все такое)
SKEPTIC, Да, пожалуй N будет маловато. Лучше M.
На виртуальной машине и карты виртуальные, там по дыркам ограничений нет. А ещё можно создавать дополнительные серевые карты (eth0:0, eth0:1 и т.д.). Ну и несколько адресов на одной сетевушке никто не отменял.
1. Выбор протокола отправки и получения пакетов (IPv4/IPv6)
С точки зрения программиста выбор протокола отправки не регулируется адресом. Протокол выбирается при самом первом вызове socket(), набором его параметров. Адрес, указываемый в bind(), должен соответствовать протоколу в socket(). Т.е. если в socket вы укажете AF_INET6, а в bind адрес 127.0.0.1, то, видимо, bind вернет ошибку. Хотя я не проверял этот момент.
res2001, как минимум, INET6-сокеты могут принимать и IPv6, и IPv4-соединения. INET6-сокет можно забайндить на IPv4-адрес указанием маппинга v6-v4: ::ffff:127.0.0.1.
Но технически вы правы.
INET6-сокет можно забайндить на IPv4-адрес указанием маппинга v6-v4: ::ffff:127.0.0.1.
Интересно. Не знал. Спасибо.
И это правильно - обратная совместимость в рамках семейства IP протоколов. Думаю это можно рассматривать как исключение.
Сокеты поддерживают и другие не совместимые с IP протоколы - unix socket, appletalk, x25, ...
При биндинге можно указать вместо адреса константу INADDR_ANY (0.0.0.0) - т.е. все доступные адреса, тогда программа будет слушать указанный порт на всех адресах, доступных ОС.
Адрес 127.0.0.1 (или любой из подсети 127.0.0.0/8) назначают, обычно тогда, когда сервис должен работать только в рамках локальной машины. Например у вас есть обратный прокси на nginx и пара сайтов на apache. Прокси будет слушать внешний адрес на 443 порту, а сайты вполне могут слушать 127.0.0.1 и принимать подключения только от прокси.