Читать «UNIX: разработка сетевых приложений» онлайн - страница 57
Уильям Ричард Стивенс
■ Вы также встретите типы данных u_char
, u_short
, u_int
и u_long
, которые не имеют знака. POSIX определяет их с замечанием, что они устарели. Они предоставляются в целях обратной совместимости.
■ И адрес IPv4, и номер порта TCP и UDP всегда хранятся в структуре в соответствии с порядком байтов, определенным в сети (
■ К 32-разрядному адресу IPv4 можно обратиться двумя путями. Например, если serv
— это структура адреса сокета Интернета, то serv.sin_addr
указывает на 32-разрядный адрес IPv4 как на структуру in_addr
, в то время как serv.sin_addr.s_addr
указывает на тот же 32-разрядный адрес IPv4 как на значение типа in_addr_t
(обычно это 32-разрядное целое число без знака). Нужно следить за корректностью обращения к адресам IPv4, особенно при использовании их в качестве аргументов различных функций, потому что компиляторы часто передают структуры не так, как целочисленные переменные.
ПРИМЕЧАНИЕ
Причина того, что sin_addr является структурой, а не просто целым числом без знака, носит исторический характер. В более ранних реализациях (например, 4.2BSD) структура in_addr определялась как объединение (union) различных структур, чтобы сделать возможным доступ к каждому из четырех байтов 32-разрядного IPv4-адреса, а также к обоим входящим в него 16-разрядным значениям. Эта возможность использовалась в адресах классов А, В и С для выборки соответствующих байтов адреса. Но с появлением подсетей и последующим исчезновением различных классов адресов (см. раздел А.4) и введением бесклассовой адресации (classless addressing) необходимость в объединении структур отпала. В настоящее время большинство систем отказались от использования объединения и просто определяют in_addr как структуру, содержащую один элемент типа in_addr_t.
■ Элемент sin_zero
не используется, но мы sin_zero
.