Обобщенная структура адреса

Разработчики некоторых программ выполняют манипуляции с протокольными адресами, не учитывая подробных сведений о том, как определено представление адреса в каждом семействе протоколов. Например, может возникнуть необходимость написать процедуру, которая принимает в качестве параметра определение произвольной оконечной точки протокола и выбирает одно из нескольких возможных действий в зависимости от типа адреса. Для обеспечения возможности создания таких программ в системе сокетов определен обобщенный формат, используемый во всех адресах оконечных точек. Такой обобщенный формат состоит из следующей пары значений:

(address_family, endpoint_address) 

Здесь поле address_family (семейство адресов) содержит константу, которая определяет один из заранее назначенных типов адресов, а поле endpoint_address (адрес оконечной точки) содержит адрес оконечной точки, в котором используется стандартное представление для указанного типа адреса. Надежно - фотошоп создание сайта уроки - у нас дешевле!

На практике программное обеспечение сокетов содержит объявления заранее определенных структур С для адреса оконечных точек. В прикладных программах эти заранее определенные структуры используются, когда возникает необходимость сохранить в памяти адреса оконечных точек или использовать оверлейную структуру для определения местонахождения отдельных полей в структуре. Наиболее общая структура известна под названием sockaddr. Она содержит 2-байтовый идентификатор семейства адресов и 14-байтовый массив для хранения адреса:

struct sockaddr { /* Структура для хранения адреса */ u_char sa_len; /* Общая длина */ u_short sa_family; /* Тип адреса */ cHar sa data[14]; /* Значение адреса */ }?

К сожалению, не во всех семействах адресов определены оконечные точки, которые вписываются в структуру sockaddr. Например, в некоторых системах UNIX предусмотрена возможность определять в семействе адресов AFJJNIX программную конструкцию, которую принято называть именованным каналом. Адреса оконечной точки в семействе AF_UNIX состоят из имени пути в файловой системе, которое может намного превышать по длине 14 байтов. Поэтому в прикладных программах нельзя использовать структуру sockaddr при объявлении переменных, поскольку переменная, объявленная с типом sockaddr, не имеет достаточной длины для хранения всех возможных адресов оконечных точек.

На практике часто возникает путаница, поскольку структура sockaddr как раз и предназначена для хранения адресов семейства AF_INET. Поэтому программное обеспечение TCP/IP работает правильно, даже если программист объявляет переменные как относящиеся к типу sockaddr. Однако для обеспечения переносимости и удобства сопровождения программ в коде работы с протоколами TCP/IP не следует использовать в объявлениях структуру sockaddr. Вместо этого структура sockaddr должна применяться только в качестве оверлейной структуры, а код должен ссылаться только на поле sa_family этой структуры.

В каждом семействе протоколов, в котором используются сокеты, определено точное представление адресов оконечных точек, а в программном обеспечении сокетов предусмотрены соответствующие объявления структур. Каждый адрес оконечной точки TCP/IP состоит из 2-байтового поля, которое обозначает тип адреса (в нем должна быть задана константа AF_INET), 2-байтового поля номера порта, 4-байтового поля IP-адреса и 8-байтового поля, которое остается неиспользуемым. Этот формат определен в заранее заданной структуре sockaddr_in:

struct sockaddrjln { /* Структура для хранения адреса */ u_char sin_len; /* Общая длина */ ujshort sin_family; /* Тип адреса */ u_short sinjport; /* номер порта протокола */ struct in_addr sin_addr; /* IP-адрес (в некоторых системах */ /* объявляется с типом u_long) */ char sin_zero[8]; /* Не используется (устанавливается */ /* равным нулю) */

В этой книге указанная структура описана в соответствии со спецификацией выпуска 4.4 программного обеспечения Berkeley и последующих версий систем; более старые версии структуры sockaddr не включают поле sa_len.

В приложении, в котором используются исключительно только протоколы TCP/IP, можно применять структуру sockaddr_in; в нем никогда не потребуется использовать структуру sockaddr.

В прикладной программе для представления оконечной точки связи протоколов TCP/IP используется структура sockaddrin, которая содержит и IP-адрес, и номер порта протокола. Программисты должны соблюдать осторожность, разрабатывая программы, в которых используется сочетание разных семейств протоколов, поскольку для адресов оконечных точек некоторых протоколов, отличных от TCP/IP, требуется структура больших размеров.

Похожие статьи Меню Опрос Фото Популярное