Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 226

Автор Уильям БтивСнс

Листинг 29.15. Ѐункция open_output, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ libnet

//udpcksum/senddnsquery-libnet.c

 7 static libnet_t *l; /* дСскриптор libnet */


 8 void

 9 open_output(void)

10 {

11  char errbuf[LIBNET_ERRBUF_SIZE];

12  /* инициализация libnet с ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ сокСтом IPv4 */

13  l = libnet_init(LIBNET_RAW4, NULL, errbuf);

14  if (l == NULL) {

15   err_quit("Can't initialize libnet: %s", errbuf);

16  }

17 }

ОбъявлСниС дСскриптора libnet

7 Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ libnet ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ libnet_t. Ѐункция libnet_init Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° этот Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ пСрСдаСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ функциям libnet для обращСния ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ сокСту. Π’ этом смыслС Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ дСскрипторам сокСтов ΠΈ устройств pcap.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ libnet

12-16 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ libnet_init, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ символьного сокСта IPv4. Для этого Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° указываСтся константа LIBNET_RAW4. Π’ случаС возникновСния ошибки функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ тСкст сообщСния Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ errbuf, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ распСчатываСм.

Ѐункция send_dns_query для libnet прСдставлСна Π² листингС 29.16. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Π΅Π΅ с функциями send_dns_query ΠΈ udp_write для ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… сокСтов.

Листинг 29.16. Ѐункция send_dns_query, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ libnet

//udpcksum/senddnsquery-libnet.c

18 void

19 send_dns_query(void)

20 {

21  char qbuf[24], *ptr;

22  u_int16_t one;

23  int packet_size = LIBNET_UDP_H + LIBNET_DNSV4_H + 24;

24  static libnet_ptag_t ip_tag, udp_tag, dns_tag;


25  /* построСниС запроса Π²Π½ΡƒΡ‚Ρ€ΠΈ UDP-ΠΏΠ°ΠΊΠ΅Ρ‚Π° */

26  ptr = qbuf;

27  memcpy(ptr, "\001a\014root-servers\003net\000", 20);

28  ptr += 20;

29  one = htons(1);

30  memcpy(ptr, &one, 2); /* Ρ‚ΠΈΠΏ запроса = A */

31  ptr += 2;

32  memcpy(ptr, &one, 2); /* класс запроса = 1 (IP-адрСс) */


33  /* Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° DNS */

34  dns_tag = libnet_build_dnsv4(

35   1234 /* ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ */,

36   0x0100 /* Ρ„Π»Π°Π³ΠΈ: рСкурсия Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° */,

37   1 /* ΠΊΠΎΠ»-Π²ΠΎ запросов */, 0 /* ΠΊΠΎΠ»-Π²ΠΎ записСй Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ */,

38   0 /* ΠΊΠΎΠ»-Π²ΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹Ρ… записСй */, 0 /* ΠΊΠΎΠ»-Π²ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… */,

39   qbuf /* запрос */,

40   24 /* Π΄Π»ΠΈΠ½Π° запроса */, 1, dns_tag);

41  /* Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP */

42  udp_tag = libnet_build_udp(

43   ((struct sockaddr_in*)local)->

44    sin_port /* ΠΏΠΎΡ€Ρ‚ отправитСля */,

45   ((struct sockaddr_in*)dest)->

46    sin_port /* ΠΏΠΎΡ€Ρ‚ получатСля */,

47   packet_size /* Π΄Π»ΠΈΠ½Π° */, 0 /* ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ сумма */,

48   NULL /* ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ */, 0 /* Π΄Π»ΠΈΠ½Π° ΠΏΠΎΠ»Π΅Π·Π½. Π΄Π°Π½Π½Ρ‹Ρ… */, l, udp_tag);

49  /* Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ установили ΠΊΠΎΠ½Ρ‚Ρ€. сумму Ρ€Π°Π²Π½ΠΎΠΉ Π½ΡƒΠ»ΡŽ, libnet автоматичСски */

50  /* рассчитаСт ΠΊΠΎΠ½Ρ‚Ρ€. сумму UDP. Π­Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ. */

51  if (zerosum)

52   if (libnet_toggle_checksum(l, udp_tag, LIBNET_OFF) < 0)

53    err_quit("turning off checksums: %s\n", libnet_geterror(l));

54  /* Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ IP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° */

55  ip_tag = libnet_build_ipv4(packet_size + LIBNET_IPV4_H /* Π΄Π»ΠΈΠ½Π° */,

56   0 /* tos */, 0 /* IP ID */, 0 /* Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚*/,

57   TTL_OUT /* ttl */, IPPROTO_UDP /* ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» */,

58   0 /* ΠΊΠΎΠ½Ρ‚Ρ€. сумма */,

59   ((struct sockaddr_in*)local)->sin_addr.s_addr /* ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ */,

60   ((struct sockaddr_in*)dest)->sin_addr.s_addr /* ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ */,

61   NULL /* ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ */, 0 /* Π΄Π»ΠΈΠ½Π° ΠΏΠΎΠ»Π΅Π·Π½. Π΄Π°Π½Π½Ρ‹Ρ… */, l, ip_tag);


62  if (libnet_write(l) < 0) {

63   err_quit("libnet_write: %s\n", libnet_geterror(l));

64  }

65  if (verbose)

66   printf("sent: %d bytes of data\n", packet_size);

67  }

Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ запроса DNS

25-32 ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с формирования запроса DNS, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выполняСтся Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² строках 25–30 листинга 29.8.

34-40 Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ libnet_build_dnsv4, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ поля ΠΏΠ°ΠΊΠ΅Ρ‚Π° DNS Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Нам достаточно Π·Π½Π°Ρ‚ΡŒ содСрТимоС запроса, Π° упорядочСниСм этого содСрТимого Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° DNS занимаСтся функция.

Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы UDP

42-48 ΠœΡ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ UDP, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ libnet_build_udp. Поля Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° UDP ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы Ρ€Π°Π²Π½ΠΎ 0, libnet автоматичСски рассчитываСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму.

49-52 Π•сли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΠ» вычислСниС ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ суммы, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ libnet явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IP

53-65 ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ построСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° IPv4 Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ libnet_build_ipv4.

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° libnet автоматичСски записываСт ΠΏΠΎΠ»Π΅ ip_len Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС Π±Π°ΠΉΡ‚ΠΎΠ². Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ пСрСносимости ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ благодаря использованию Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° UDP-Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹

66-70 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ libnet_write для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Π² ΡΠ΅Ρ‚ΡŒ.

Ѐункция send_dns_query, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ libnet, состоит всСго ΠΈΠ· 67 строк, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² вСрсии, Ρ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠ΅ΠΉ с ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ сокСтами, общая Π΄Π»ΠΈΠ½Π° ΠΊΠΎΠ΄Π° составила 96 строк, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»ΠΎ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ 2 Ρ‚Ρ€ΡŽΠΊΠ°, связанных с ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ.

29.8. РСзюмС

Π‘ΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ сокСты ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ IP-Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ поняты ядром, Π° доступ ΠΊ ΠΊΠ°Π½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ позволяСт ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°Π΄Ρ€Ρ‹ канального уровня Π»ΡŽΠ±Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² (Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ IP). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° tcpdump β€” это, вСроятно, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ нСпосрСдствСнный доступ ΠΊ ΠΊΠ°Π½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ.

Π’ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы доступа ΠΊ ΠΊΠ°Π½Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ. ΠœΡ‹ рассмотрСли ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π‘Π΅Ρ€ΠΊΠ»ΠΈ, DLPI SVR4 ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹Π΅ сокСты Linux (SOCK_PACKET). Но Ρƒ нас имССтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, Π½Π΅ вникая Π² различия пСрСчислСнных способов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽΡΡ Π² свободном доступС ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π·Π°Ρ…Π²Π°Ρ‚Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² libcap.

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ осущСствляСтся Π² Ρ€Π°Π·Π½Ρ‹Ρ… систСмах ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. Π‘Π²ΠΎΠ±ΠΎΠ΄Π½ΠΎ распространяСмая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° libnet скрываСт различия ΠΌΠ΅ΠΆΠ΄Ρƒ систСмами ΠΈ прСдоставляСт интСрфСйс для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ сокСты ΠΈ нСпосрСдствСнно Π½Π° канальном ΡƒΡ€ΠΎΠ²Π½Π΅.

УпраТнСния

1. ΠšΠ°ΠΊΠΎΠ²ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° canjump Π² листингС 29.7?

2. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ udpcksum Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнным сообщСниСм ΠΎΠ± ошибкС являСтся сообщСниС ΠΎ нСдоступности ΠΏΠΎΡ€Ρ‚Π° ICMP (Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ назначСния Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ сСрвСр ΠΈΠΌΠ΅Π½) ΠΈΠ»ΠΈ нСдоступности ΡƒΠ·Π»Π° ICMP. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ истСчСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ оТидания, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ udp_read Π² листингС 29.6, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сообщСниС ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ошибкС фактичСски являСтся ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ Π½Π° наш запрос DNS. ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π»Π° эти ошибки ICMP.

Π“Π»Π°Π²Π° 30

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ устройство ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра

30.1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ написании сСрвСра ΠΏΠΎΠ΄ Unix ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² управлСния процСссом:

β–  ΠΠ°Ρˆ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ сСрвСр, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² листингС 1.5, Π±Ρ‹Π» ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ (iterative), Π½ΠΎ количСство сцСнариСв, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ являСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ, вСсьма ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ клиСнтского запроса, Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ² ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ запроса.

β–  Π’ листингС 5.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ (concurrent) сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ клиСнтского запроса ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π» Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fork. Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ сСрвСров, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ΄ Unix, ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² эту ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ.

β–  Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 6.8 ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ сСрвСра TCP, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ имССтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ процСсс, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ любоС количСство клиСнтских запросов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ select.

β–  Π’ листингС 26.2 ΠΌΡ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр, создав для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса.

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим Π΄Π²Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… способа ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ устройства ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвСра.

β–  ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ созданиС Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов (preforking). Π’ этом случаС ΠΏΡ€ΠΈ запускС сСрвСра выполняСтся функция fork, которая создаСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство (ΠΏΡƒΠ») Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ клиСнтского запроса занимаСтся процСсс, взятый ΠΈΠ· этого Π½Π°Π±ΠΎΡ€Π°.

β–  ΠŸΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ созданиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (prethreading). ΠŸΡ€ΠΈ запускС сСрвСра создаСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство (ΠΏΡƒΠ») ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π°.

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ мноТСство вопросов, связанных с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ созданиСм ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов. НапримСр, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли Π² ΠΏΡƒΠ»Π΅ окаТСтся нСдостаточноС количСство процСссов ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²? А Ссли ΠΈΡ… Π±ΡƒΠ΄Π΅Ρ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ? Как Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ процСссы (ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ) ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ свои дСйствия?