Что значат константы INADDR_ANY и INADDR_LOOPBACK?

Объясните пожалуйста, правильно ли я понимаю, что функции htonl/htons - преобразовывают неупорядоченные байты в упорядоченные? И почему мы передаем аргументами константы, если адреса всегда разные? Не могу понять.... Есть еще вопросы: почему sin_addr - структура, если там только один тип данных?

if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
        perror("bind");
        exit(2); 
}

Касательно кода выше три вопроса:

  1. Выполняется ли привязка несмотря на то, что мы написали эту функцию в скобках? То есть мы же не в отдельной строке прописали эту функцию, не поставили точку с запятой, но она все равно выполнится?
  2. Как происходит приведение типа данных sockaddr_in к sockaddr, если в первом случае структура состоит из 4 типов данных, а во втором всего из двух?
  3. Правильно ли я понимаю, что bind - означает указать, на какой адрес будут приходить данные? Если да, то зачем это нужно, разве могут данные прийти куда то, кроме как на сервер? Или это реализовывается в крупных дата центрах, где много разных серверов, а мне достаточно сделать привязку по своему единственному айпишнику? Все, что будет приходить на адрес, привязанный к сокету, будет взаимодействовать с этим самым сокетом? А что, если несколько сокетов под таким адресом, то к какому из них придет пакет?

Ответы (1 шт):

Автор решения: Harry
  1. А как же? Конечно, выполнится. Иначе что будет сравниваться с нулем? :) Вот если вы напишете что-то типа if (false && (bind(...) < 0)) — тогда дело другое из-за сокращенного вычисления логического выражения.

  2. Знаете байку о том, что диаметр бака шаттла определяется шириной крупа древнеримской лошади? :) Вот примерно та же картина. Так сложилось исторически. Но это чисто мое личное мнение по данному вопросу.

  3. Представьте, что у вас пара сетевых карт в машине, да еще и 127.0.0.1 имеется... Вот к какому интерфейсу "прибиндитесь", тот и прослушиваете. Будете слушать только loopback — и все, через сетевые карты к серверу будет не достучаться. Лучше всего — используйте INADDR_ANY, и прослушиваться будут все ваши интерфейсы. Несколько сокетов на один ip/port вы посадить не сможете, получите ошибку.

htonl/htons — "host to net" — функция, которая преобразует число (l или s — длинное или короткое) из представления на вашем компьютере (это может быть little endian или big endian, для того и функция, что она берет выяснение этого вопроса на себя) в сетевое представление, где используется big endian как единый стандарт обмена информацией между разными архитектурами.

→ Ссылка