В 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 (), иначе это может привести к непредвиденным нежелательным значениям в вашей структуре.