UNIX: разработка сетевых приложений

На нашем литературном портале можно бесплатно читать книгу UNIX: разработка сетевых приложений, Стивенс Уильям Ричард-- . Жанр: ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
UNIX: разработка сетевых приложений
Название: UNIX: разработка сетевых приложений
Дата добавления: 16 январь 2020
Количество просмотров: 394
Читать онлайн

UNIX: разработка сетевых приложений читать книгу онлайн

UNIX: разработка сетевых приложений - читать бесплатно онлайн , автор Стивенс Уильям Ричард

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

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

Листинг 19.4. Структура sadb_address

struct sadb_address {

 u_int16_t sadb_address_len;       /* длина расширения с адресом / 8 */

 u_int16_t sadb_address_exttype;   /* SADB_EXT_ADDRESS_{SRC,DST,PROXY} */

 u_int8_t  sadb_address_proto;     /* протокол IP или 0 (любой) */

 u_int8_t  sadb_address_prefixlen; /* # значащих битов адреса */

 u_int16_t sadb_address_reserved;  /* зарезервирован для послед. использования */

};

/* далее следует структура sockaddr соответствующего семейства */

Завершают список обязательных расширений сообщения

SADB_ADD
ключи аутентификации и шифрования — расширения
SADB_EXT_KEY_AUTH
и
SADB_EXT_KEY_ENCRYPT
, описываемые структурой
sadb_key
(листинг 19.5). Поле
sadb_key_exttype
определяет тип ключа (ключ аутентификации или шифрования), поле
sadb_key_bits
задает длину ключа в битах, а сам ключ следует за структурой
sadb_key
.

Листинг 19.5. Структура sadb_key

struct sadb_key {

 u_int16_t sadb_key_len;      /* длина расширения с ключом / 8 */

 u_int16_t sadb_key_exttype;  /* SADB_EXT_KEY_{AUTH,ENCRYPT} */

 u_int16_t sadb_key_bits;     /* # битов в ключе */

 u_int16_t sadb_key_reserved; /* зарезервировано для расширения */

};

/* далее следуют данные о самом ключе */

Программа, добавляющая статическую запись в базу данных безопасности, представлена в листинге 19.6.

Листинг 19.6. Программа, использующая команду SADB_ADD

//key/add с

 33 void

 34 sadb_add(struct sockaddr *src, struct sockaddr *dst, int type, int alg,

 35  int spi, int keybits, unsigned char *keydata)

 36  {

 37  int s;

 38  char buf[4096], *p; /* XXX */

 39  struct sadb_msg *msg;

 40  struct sadb_sa *saext;

 41  struct sadb_address *addrext;

 42  struct sadb_key *keyext;

 43  int len;

 44  int mypid;

 45  s = Socket(PF_KEY, SOCK_RAW, PF_KEY_V2);

 46  mypid = getpid();

 47  /* Формирование и запись запроса SADB_ADD */

 48  bzero(&buf, sizeof(buf));

 49  p = buf;

 50  msg = (struct sadb_msg*)p;

 51  msg->sadb_msg_version = PF_KEY_V2;

 52  msg->sadb_msg_type = SADB_ADD;

 53  msg->sadb_msg_satype = type;

 54  msg->sadb_msg_pid = getpid();

 55  len = sizeof(*msg);

 56  p += sizeof(*msg);

 57  saext = (struct sadb_sa*)p;

 58  saext->sadb_sa_len = sizeof(*saext) / 8;

 59  saext->sadb_sa_exttype = SADB_EXT_SA;

 60  saext->sadb_sa_spi = htonl(spi);

 61  saext->sadb_sa_replay = 0; /* статические ключи не защищают от повтора */

 62  saext->sadb_sa_state = SADB_SASTATE_MATURE;

 63  saext->sadb_sa_auth = alg;

 64  saext->sadb_sa_encrypt = SADB_EALG_NONE;

 65  saext->sadb_sa_flags = 0;

 66  len += saext->sadb_sa_len * 8;

 67  p += saext->sadb_sa_len * 8;

 68  addrext = (struct sadb_address*)p;

 69  addrext->sadb_address_len = (sizeof(*addrext) + salen(src) + 7) / 8;

 70  addrext->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;

 71  addrext->sadb_address_proto = 0; /* any protocol */

 72  addrext->sadb_address_prefixlen = prefix_all(src);

 73  addrext->sadb_address_reserved = 0;

 74  memcpy(addrext + 1, src, salen(src));

 75  len += addrext->sadb_address_len * 8,

 76  p += addrext->sadb_address_len * 8;

 77  addrext = (struct sadb_address*)p;

 78  addrext->sadb_address_len = (sizeof(*addrext) + salen(dst) + 7) / 8;

 79  addrext->sadb_address_exttype = SADB_EXT_ADDRESS_DST;

 80  addrext->sadb_address_proto = 0; /* any protocol */

 81  addrext->sadb_address_prefixlen = prefix_all(dst);

 82  addrext->sadb_address_reserved = 0;

 83  memcpy(addrext + 1, dst, salen(dst));

 84  len += addrext->sadb_address_len * 8;

 85  p += addrext->sadb_address_len * 8;

 86  keyext = (struct sadb_key*)p;

 87  /* обеспечивает выравнивание */

 88  keyext->sadb_key_len = (sizeof(*keyext) + (keybits / 8) + 7) / 8;

 89  keyext->sadb_key_exttype = SADB_EXT_KEY_AUTH;

 90  keyext->sadb_key_bits = keybits;

 91  keyext->sadb_key_reserved = 0;

Перейти на страницу:
Комментариев (0)
название