UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
92 memcpy(keyext + 1, keydata, keybits / 8);
93 len += keyext->sadb_key_len * 8;
94 p += keyext->sadb_key_len * 8;
95 msg->sadb_msg_len = len / 8;
96 printf("Sending add message:n");
97 print_sadb_msg(buf, len);
98 Write(s, buf, len);
99 printf("nReply returned:n");
100 /* считывание и вывод ответа SADB_ADD, игнорируя любые другие */
101 for (;;) {
102 int msglen;
103 struct sadb_msg *msgp;
104 msglen = Read(s, &buf, sizeof(buf));
105 msgp = (struct sadb_msg*)&buf;
106 if (msgp->sadb_msg_pid == mypid &&
107 msgp->sadb_msg_type == SADB_ADD) {
108 print_sadb_msg(msgp, msglen);
109 break;
110 }
111 }
112 close(s);
113 }
55-56
47-56
SADB_ADD
sadb_msg_len
len
57-67
SA
sadb_sa_spi
htonl
SA
SADB_SASTATE_MATURE
SADB_EALG_NONE
68-76
SADB_EXT_ADDRESS_SRC
Значение протокола устанавливается равным нулю, что подразумевает действительность соглашения для всех протоколов. Длина префикса устанавливается равной соответствующей длине версии IP (то есть 32 разряда для IPv4 и 128 разрядов для IPv6). При расчете значения поля длины мы добавляем к реальному значению число 7 перед делением на 8, что гарантирует выравнивание по 64-разрядной границе, обязательное для всех расширений, передаваемых через сокеты PF_KEY. Структура
sockaddr
77-85
SADB_EXT_ADDRESS_DST
86-94
SADB_EXT_KEY_AUTH
95-98
print_sadb_msg
99-111
SADB_ADD
print_sadb_msg
Пример
Мы запускаем программу, требуя от нее установки соглашения о безопасности, касающегося трафика между узлами 127.0.0.1 и 127.0.0.1 (то есть локального трафика):
macosx % <b>add 127.0.0.1 127.0.0.1 HMAC-SHA-1-96 160 </b>
<b> 0123456789abcdef0123456789abcdef01234567</b>
Sending add message:
SADB Message Add, errno 0, satype IPsec AH, seq 0, pid 6246
SA: SPI=39030 Replay Window=0 State=Mature
Authentication Algorithm: HMAC-SHA-1
Encryption Algorithm: None
Source address: 127.0.0.1/32
Dest address: 127.0.0.1/32
Authentication key. 160 bits: 0x0123456789abcdef0123456789abcdef01234567
Reply returned:
SADB Message Add, errno 0, satype IPsec AH, seq 0, pid 6246
SA: SPI=39030 Replay Window=0 State=Mature
Authentication Algorithm: HMAC-SHA-1
Encryption Algorithm: None
Source address: 127.0.0.1/32
Dest address: 127.0.0.1/32
Обратите внимание, что в ответе системы отсутствует ключ. Дело в том; что ответ направляется на все сокеты PF_KEY, которые, однако, могут принадлежать к разным доменам, а данные о ключах не должны передаваться между доменами. После добавления записи в базу данных мы даем команду
ping 127.0.0.1
macosx % <b>dump</b>