Учебники

Unix Socket — Структуры

В Unix Socket Programming используются различные структуры для хранения информации об адресе и порте, а также другой информации. Большинство функций сокетов требуют указателя на структуру адреса сокета в качестве аргумента. Структуры, определенные в этой главе, относятся к семейству интернет-протоколов.

SOCKADDR

Первая структура — это sockaddr, который содержит информацию о сокете —

struct sockaddr {
   unsigned short   sa_family;
   char             sa_data[14];
};

Это общая структура адреса сокета, которая будет передаваться в большинстве вызовов функций сокета. В следующей таблице приведено описание полей членов.

атрибут Ценности Описание
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Он представляет адресную семью. В большинстве интернет-приложений мы используем AF_INET.
sa_data Адрес протокола Содержимое 14 байтов специфичного для протокола адреса интерпретируется в соответствии с типом адреса. Для семейства Интернет мы будем использовать номер порта IP-адрес, который представлен структурой sockaddr_in, определенной ниже.

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Sockaddr в

Вторая структура, которая помогает вам ссылаться на элементы сокета, выглядит следующим образом:

struct sockaddr_in {
   short int            sin_family;
   unsigned short int   sin_port;
   struct in_addr       sin_addr;
   unsigned char        sin_zero[8];
};

Вот описание полей участника —

атрибут Ценности Описание
sa_family

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

Он представляет адресную семью. В большинстве интернет-приложений мы используем AF_INET.
sin_port Сервисный порт 16-битный номер порта в сетевом порядке байтов.
sin_addr Айпи адрес 32-битный IP-адрес в сетевом порядке байтов.
sin_zero Не используется Вы просто устанавливаете это значение в NULL, поскольку оно не используется.

AF_INET

AF_UNIX

AF_NS

AF_IMPLINK

в адрес

Эта структура используется только в приведенной выше структуре в качестве поля структуры и содержит 32-битный netid / hostid.

struct in_addr {
   unsigned long s_addr;
};

Вот описание полей участника —

атрибут Ценности Описание
s_addr сервисный порт 32-битный IP-адрес в сетевом порядке байтов.

hostent

Эта структура используется для хранения информации, связанной с хостом.

struct hostent {
   char *h_name; 
   char **h_aliases; 
   int h_addrtype;  
   int h_length;    
   char **h_addr_list
	
#define h_addr  h_addr_list[0]
};

Вот описание полей участника —

атрибут Ценности Описание
h_name ti.com и т. д. Это официальное имя хоста. Например, tutorialspoint.com, google.com и т. Д.
h_aliases TI Содержит список псевдонимов имен хостов.
h_addrtype AF_INET Он содержит семейство адресов, а в случае интернет-приложения это всегда будет AF_INET.
h_length 4 Он содержит длину IP-адреса, которая равна 4 для Интернет-адреса.
h_addr_list in_addr Для интернет-адресов массив указателей h_addr_list [0], h_addr_list [1] и т. Д. Являются указателями на структуру in_addr.

ПРИМЕЧАНИЕ. — h_addr определяется как h_addr_list [0] для сохранения обратной совместимости.

servent

Эта конкретная структура используется для хранения информации, связанной с обслуживанием и связанными портами.

struct servent {
   char  *s_name; 
   char  **s_aliases; 
   int   s_port;  
   char  *s_proto;
};

Вот описание полей участника —

атрибут Ценности Описание
s_name HTTP Это официальное название сервиса. Например, SMTP, FTP POP3 и т. Д.
s_aliases ALIAS Содержит список псевдонимов служб. Большую часть времени это будет установлено в NULL.
s_port 80 Это будет иметь связанный номер порта. Например, для HTTP это будет 80.
s_proto

TCP

UDP

Он установлен на используемый протокол. Интернет-услуги предоставляются с использованием TCP или UDP.

TCP

UDP

Советы по сокетным конструкциям

Адресные структуры сокетов являются неотъемлемой частью любой сетевой программы. Мы распределяем их, заполняем и передаем указатели на них различным функциям сокетов. Иногда мы передаем указатель на одну из этих структур функции сокета, и она заполняет содержимое.

Мы всегда передаем эти структуры по ссылке (т. Е. Передаем указатель на структуру, а не на саму структуру), и мы всегда передаем размер структуры в качестве другого аргумента.

Когда функция сокета заполняет структуру, длина также передается по ссылке, так что ее значение может быть обновлено функцией. Мы называем эти аргументы значение-результат.

Всегда устанавливайте для структурных переменных значение NULL (т. Е. ‘\ 0’), используя memset () для функций bzero (), иначе это может привести к непредвиденным нежелательным значениям в вашей структуре.