Ответ 1
-
bind() INADDR_ANY НЕ "генерирует случайный IP". Он связывает сокет со всеми доступными интерфейсами.
-
Для сервера обычно требуется привязка ко всем интерфейсам, а не только к локальному хосту.
-
Если вы хотите привязать свой сокет только к локальному хосту, синтаксисом будет
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
, затем вызовитеbind(my_socket, (SOCKADDR *) &my_sockaddr,...)
. -
Как это бывает, "INADDR_ANY" - это константа, которая оказывается равной "нулю":
http://www.castaglia.org/proftpd/doc/devel-guide/src/include/inet.h.html
# define INADDR_ANY ((unsigned long int) 0x00000000) ... # define INADDR_NONE 0xffffffff ... # define INPORT_ANY 0 ...
-
Если вы еще не знакомы с этим, я настоятельно рекомендую вам ознакомиться с Beej Guide to Sockets Programming:
Поскольку люди все еще читают это, дополнительная заметка:
Когда процесс хочет получать новые входящие пакеты или соединения, он должен привязать сокет к адресу локального интерфейса, используя bind (2).
В этом случае только один IP-сокет может быть привязан к любой локальной (адрес, порт). Когда INADDR_ANY указывается в вызове bind, сокет будет привязан ко всем локальным интерфейсам.
Когда вызов (2) вызывается на несвязанный сокет, сокет автоматически привязывается к произвольному свободному порту с локальным адресом, установленным в INADDR_ANY.
Когда вызов connect (2) вызывается на несвязанный сокет, сокет автоматически привязан к произвольному свободному порту или к используемому совместно используемому порту с локальным адресом, установленным в INADDR_ANY...
Существует несколько специальных адресов: INADDR_LOOPBACK (127.0.0.1) всегда ссылается на локальный хост через устройство loopback; INADDR_ANY (0.0.0.0) означает любой адрес для привязки...
Также:
bind() - привязать имя к сокету:
Если поле (sin_addr.s_addr) установлено в константу INADDR_ANY, как определено в netinet/in.h, вызывающий абонент запрашивает, чтобы сокет был привязан ко всем сетевым интерфейсам на хосте. Впоследствии UDP-пакеты и TCP-соединения из всех интерфейсов (которые соответствуют имени привязки) направляются в приложение. Это становится важным, когда сервер предлагает услугу для нескольких сетей. Если оставить адрес не указанным, сервер может принимать все UDP-пакеты и запросы TCP-соединения, сделанные для своего порта, независимо от сетевого интерфейса, по которому были получены запросы.