bind()
из INADDR_ANY
действительно НЕ «генерировать случайные IP». Он связывает сокет со всеми доступными интерфейсами .
Для сервера обычно требуется привязка ко всем интерфейсам, а не только к «localhost».
Если вы хотите привязать свой сокет только к localhost, синтаксис будет следующим my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
: call 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 по программированию сокетов:
http://beej.us/guide/bgnet/
Поскольку люди все еще читают это, дополнительное примечание:
человек (7) ip :
Когда процесс хочет получить новые входящие пакеты или соединения, он должен привязать сокет к адресу локального интерфейса с помощью bind (2) .
В этом случае только один IP-сокет может быть привязан к любой данной локальной паре (адрес, порт). Когда INADDR_ANY указан в вызове привязки, сокет будет привязан ко всем локальным интерфейсам.
Когда listen (2) вызывается для несвязанного сокета, сокет автоматически привязывается к случайному свободному порту с локальным адресом, установленным на INADDR_ANY.
Когда connect (2) вызывается для несвязанного сокета, сокет автоматически привязывается к случайному свободному порту или к используемому общему порту с локальным адресом, установленным на INADDR_ANY ...
Есть несколько специальных адресов: INADDR_LOOPBACK (127.0.0.1) всегда обращается к локальному хосту через устройство обратной связи; INADDR_ANY (0.0.0.0) означает любой адрес для привязки ...
Также:
bind () - привязывает имя к сокету :
Если в поле (sin_addr.s_addr) задана константа INADDR_ANY, как определено в netinet / in.h, вызывающий запрос запрашивает привязку сокета ко всем сетевым интерфейсам на хосте. Впоследствии пакеты UDP и TCP-соединения со всех интерфейсов (которые соответствуют связанному имени) направляются в приложение. Это становится важным, когда сервер предлагает услугу нескольким сетям. Если адрес не указан, сервер может принимать все UDP-пакеты и запросы TCP-соединения, сделанные для его порта, независимо от сетевого интерфейса, на который поступили запросы.
htonl(INADDR_ANY)
. В документе сказано, что эта функция генерирует случайный IP ... » Это неверно. Какие документы вам об этом говорят?