Структура sockaddr_in описывает сокет для работы с протоколами
TCP/IP. Значение поля sin_family всегда равно AF_INET.
Поле sin_port содержит номер порта который намерен занять
процесс. Если значение этого поля равно нулю, то операционная система
сама выделит свободный номер порта для сокета. Поле sin_addr
содержит IP адрес к которому будет привязан сокет. Структура in_addr содержит поле s_addr. Этому полю можно присвоить 32х
битное значение IP адреса. Для перевода адреса в целое число из
строкового представления можно воспользоваться функцией inet_addr, которой в качестве аргумента передается указатель на строку
содержащую IP адрес в виде четырех десятичных чисел разделенных точками.
Можно, также, воспользоваться одной из следующих констант:
INADDR_ANY
все адреса локального хоста (0.0.0.0);
INADDR_LOOPBACK
адрес loopback интерфейса (127.0.0.1);
INADDR_BROADCAST
широковещательный адрес (255.255.255.255).
При присвоении значений номеру порта и адресу следует учитывать, что
порядок следования байтов на разных архитектурах различен. При передаче
данных по сети общепринятым является представление чисел в формате
big-endian, в котором самый старший байт целого числа имеет наименьший
адрес, а самый младший байт имеет наибольший адрес. Компьютеры
построенные на архитектуре Intel x86 используют схему представления
целых чисел little-endian, в которой наименьший адрес имеет самый
младший байт, а наибольший адрес имеет самый старший байт. Для
преобразования числа из той схемы которая используется на компьютере к
той которая используется в сети, и наоборот, применяются функции:
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohl(uint16_t netshort);