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