Что значат константы INADDR_ANY и INADDR_LOOPBACK?
Объясните пожалуйста, правильно ли я понимаю, что функции htonl/htons - преобразовывают неупорядоченные байты в упорядоченные? И почему мы передаем аргументами константы, если адреса всегда разные? Не могу понять.... Есть еще вопросы: почему sin_addr - структура, если там только один тип данных?
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(2);
}
Касательно кода выше три вопроса:
- Выполняется ли привязка несмотря на то, что мы написали эту функцию в скобках? То есть мы же не в отдельной строке прописали эту функцию, не поставили точку с запятой, но она все равно выполнится?
- Как происходит приведение типа данных sockaddr_in к sockaddr, если в первом случае структура состоит из 4 типов данных, а во втором всего из двух?
- Правильно ли я понимаю, что bind - означает указать, на какой адрес будут приходить данные? Если да, то зачем это нужно, разве могут данные прийти куда то, кроме как на сервер? Или это реализовывается в крупных дата центрах, где много разных серверов, а мне достаточно сделать привязку по своему единственному айпишнику? Все, что будет приходить на адрес, привязанный к сокету, будет взаимодействовать с этим самым сокетом? А что, если несколько сокетов под таким адресом, то к какому из них придет пакет?
Ответы (1 шт):
А как же? Конечно, выполнится. Иначе что будет сравниваться с нулем? :) Вот если вы напишете что-то типа
if (false && (bind(...) < 0))— тогда дело другое из-за сокращенного вычисления логического выражения.Знаете байку о том, что диаметр бака шаттла определяется шириной крупа древнеримской лошади? :) Вот примерно та же картина. Так сложилось исторически. Но это чисто мое личное мнение по данному вопросу.
Представьте, что у вас пара сетевых карт в машине, да еще и 127.0.0.1 имеется... Вот к какому интерфейсу "прибиндитесь", тот и прослушиваете. Будете слушать только loopback — и все, через сетевые карты к серверу будет не достучаться. Лучше всего — используйте
INADDR_ANY, и прослушиваться будут все ваши интерфейсы. Несколько сокетов на один ip/port вы посадить не сможете, получите ошибку.
htonl/htons — "host to net" — функция, которая преобразует число (l или s — длинное или короткое) из представления на вашем компьютере (это может быть little endian или big endian, для того и функция, что она берет выяснение этого вопроса на себя) в сетевое представление, где используется big endian как единый стандарт обмена информацией между разными архитектурами.