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

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

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 байтов специфического для протокола адреса интерпретируется в соответствии с типом адреса. Для семейства Internet мы будем использовать IP-адрес с номером порта, который представлен структурой sockaddr_in, определенной ниже.

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, поскольку оно не используется.

в адресе

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

struct in_addr {
   unsigned long s_addr;
};

Вот описание полей членов -

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

хостинг

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

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.

NOTE - h_addr определяется как h_addr_list [0] для сохранения обратной совместимости.

слуга

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

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

Вот описание полей членов -

Атрибут Значения Описание
s_name http Это официальное название сервиса. Например, SMTP, FTP POP3 и т. Д.
s_aliases НИКНЕЙМЫ Он содержит список псевдонимов служб. В большинстве случаев он будет установлен в NULL.
s_port 80 Он будет иметь связанный номер порта. Например, для HTTP это будет 80.
s_proto

TCP

UDP

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

Советы по структурам сокетов

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

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

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

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