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_ADDSADB_EXT_KEY_AUTHSADB_EXT_KEY_ENCRYPTsadb_keysadb_key_exttypesadb_key_bitssadb_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;
