bind()
з INADDR_ANY
дійсно НЕ «генерувати випадкові IP». Він прив’язує сокет до всіх доступних інтерфейсів .
Для сервера ти, як правило, хочеш прив'язати всі інтерфейси, а не лише "localhost".
Якщо ви хочете прив'язати ваш сокет лише до localhost, синтаксис буде таким 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 щодо програмування розеток:
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 ... " Це неправильно. Які документи вам про це говорять?