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

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

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

Ѐункция if_nameindex Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° массив структур if_nameindex:

struct if_nameindex {

 unsigned int if_index; /* 1, 2. ... */

 char *if_name; /* имя, Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌΠΎΠ΅ Π½ΡƒΠ»Π΅ΠΌ: "le0", ... */

};

ПослСдняя запись Π² этом массивС содСрТит структуру с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ индСксом if_index ΠΈ с пустым ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ifname. ΠŸΠ°ΠΌΡΡ‚ΡŒ для этого массива, Π° Ρ‚Π°ΠΊΠΆΠ΅ для ΠΈΠΌΠ΅Π½, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ элСмСнты массива, выдСляСтся динамичСски ΠΈ освобоТдаСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ if_freenameindex.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ прСдставим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этих Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с использованиСм ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… сокСтов.

Ѐункция if_nametoindex

Π’ листингС 18.11 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° функция if_nametoindex.

Листинг 18.11. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ индСкса интСрфСйса ΠΏΠΎ Π΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ

//libroute/if_nametoindex.c

 1 #include "unpifi.h"

 2 #include "unproute.h"


 3 unsigned int

 4 if_nametoindex(const char *name)

 5 {

 6  unsigned int idx, namelen;

 7  char *buf, *next, *lim;

 8  size_t len;

 9  struct if_msghdr *ifm;

10  struct sockadd *sa, *rti_info[RTAX_MAX];

11  struct sockaddr_dl *sdl;


12  if ((buf = net_rt_iflist(0, 0, &len)) == NULL)

13   return(0);


14  namelen = strlen(name);

15  lim = buf + len;

16  for (next = buf; next < lim; next += ifm->ifm_msglen) {

17   ifm = (struct if_msghdr*)next;

18   if (ifm->ifm_type == RTM_IFINFO) {

19    sa = (struct sockaddr*)(ifm + 1);

20    get_rtaddrs(ifm->ifm_addrs, sa, rti_info);

21    if ((sa = rti_infΠΎ[RTAX_IFP]) != NULL) {

22     if (sa->sa_family == AF_LINK) {

23      sdl = (struct sockaddr_dl*)sa;

24      if (sdl->sdl_nlen == namelen

25       && strncmp(&sdl->sdl_data[0], name,

26       sdl->sdl_nlen) == 0) {

27       idx = sdl->sdl_index; /* сохранСниС ΠΏΠ΅Ρ€Π΅Π΄

                                  Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ free */

28       free(buf);

29       return(idx);

30      }

31     }

32    }


33   }

34  }

35  free(buf);

36  return(0); /* индСкс для ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ */

37 }

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка интСрфСйсов

12-13 Наша функция net_rt_iflist Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список интСрфСйсов.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сообщСний RTM_IFINFO

17-30 ΠœΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ сообщСния Π² Π±ΡƒΡ„Π΅Ρ€Π΅ (см. рис. 18.4) Π² поисках сообщСний Ρ‚ΠΈΠΏΠ° RTM_IFINFO. Найдя Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_rtaddrs, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° структуры адрСса сокСта, Π° Ссли присутствуСт структура ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса (элСмСнт RTAX_IFP массива rti_info), Ρ‚ΠΎ имя интСрфСйса сравниваСтся с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ.

Ѐункция if_indextoname

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция, if_indextoname, ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² листингС 18.12.

Листинг 18.12. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса ΠΏΠΎ Π΅Π³ΠΎ индСксу

libroute/if_indextoname.c

 1 #include "unpifi.h"

 2 #include "unproute.h"


 3 char*

 4 if_indextoname(unsigned int index, char *name)

 5 {

 6  char *buf, *next, *lim;

 7  size_t len;

 8  struct if_msghdr *ifm;

 9  struct sockaddr *sa, *rti_info[RTAX_MAX];

10  struct sockaddr_dl *sdl;


11  if ((buf = net_rt_iflist(0, index, &len)) == NULL)

12   return (NULL);


13  lim = buf + len;

14  for (next = buf; next < lim; next += ifm->ifm_msglen) {

15   ifm = (struct if_msghdr*)next;

16   if (ifm->ifm_type == RTM_IFINFO) {

17    sa = (struct sockaddr*)(ifm + 1);

18    get_rtaddrs(ifm->ifm_addrs, sa, rti_info);

19    if ((sa = rti_info[RTAX_IFP]) != NULL) {

20     if (sa->sa_family == AF_LINK) {

21      sdl = (struct sockaddr_dl*)sa;

22      if (sdl->sdl_index == index) {

23       int slen = min(IFNAMSIZ - 1, sdl->sdl_nlen);

24       strncpy(name, sdl->sdl_data, slen);

25       name[slen] = 0; /* Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π½ΡƒΠ»ΡŒ */

26       free(buf);

27       return (name);

28      }

29     }

30    }

31   }

32  }

33  free(buf);

34  return (NULL); /* Π½Π΅Ρ‚ соотвСтствия индСксу */

35 }

Π­Ρ‚Π° функция практичСски ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ, Π½ΠΎ вмСсто поиска ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса ΠΌΡ‹ сравниваСм индСкс интСрфСйса с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ процСсса. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ нашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ net_rt_iflist β€” это Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ индСкс, поэтому Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ интСрфСйса. Когда обнаруТиваСтся совпадСниС, возвращаСтся имя интСрфСйса, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ добавляСтся Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π½ΡƒΠ»ΡŒ.

Ѐункция if_nameindex

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ функция, if_nameindex, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ массив структур if_nameindex, содСрТащих всС ΠΈΠΌΠ΅Π½Π° интСрфСйсов ΠΈ индСксы. Она ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² листингС 18.13.

Листинг 18.13. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ всСх ΠΈΠΌΠ΅Π½ ΠΈ индСксов интСрфСйсов

//libroute/if_nameindex.c

 1 #include "unpifi.h"

 2 #include "unproute.h"


 3 struct if_nameindex*

 4 if_nameindex(void)

 5 {

 6  char *buf, *next, *lim;

 7  size_t len;

 8  struct if_msghdr *ifm;

 9  struct sockaddr *sa, *rti_info[RTAX_MAX];

10  struct sockaddr_dl *sdl;

11  struct if_nameindex *result, *ifptr;

12  char *namptr;


13  if ((buf = net_it_iflist(0, 0, &len)) == NULL)

14   return (NULL);


15  if ((result = malloc(len)) == NULL) /* Π·Π°Π²Ρ‹ΡˆΠ΅Π½Π½Π°Ρ ΠΎΡ†Π΅Π½ΠΊΠ° */

16   return (NULL);

17  ifptr = result;

18  namptr = (char*)result + len; /* ΠΈΠΌΠ΅Π½Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с ΠΊΠΎΠ½Ρ†Π° Π±ΡƒΡ„Π΅Ρ€Π° */


19  lim = buf + len;

20  for (next = buf; next < lim; next += ifm->ifm_msglen) {

21   ifm = (struct if_msghdr*)next;

22   if (ifm->ifm_type == RTM_IFINFO) {

23    sa = (struct sockaddr*)(ifm + 1);

24    get_rtaddrs(ifm->ifm_addrs, sa, rti_info);

25    if ((sa = rti_infΠΎ[RTAX_IFP]) != NULL) {

26     if (sa->sa_family == AF_LINK) {

27      sdl = (struct sockaddr_in*)sa;

28      namptr -= sdl->sdl_nlen + 1;

29      strncpy(namptr, &sdl->sdl_data[0], sdl->sdl_nlen);

30      namptr[sdl->sdl_nlen] = 0; /* Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π½ΡƒΠ»ΡŒ */

31      ifptr->if_name = namptr;

32      ifptr->if_index = sdl->sdl_index;

33      ifptr++;

34     }

35    }

36   }

37  }

38  ifptr->if_name = NULL; /* ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅ΠΌ ΠΊΠΎΠ½Π΅Ρ† массива структур */

39  ifptr->if_index = 0;

40  free(buf);

41  return (result); /* Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ

                        с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ free(), ΠΊΠΎΠ³Π΄Π° всС сдСлано */

43 }

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка интСрфСйсов, Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ мСста для Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°

13-18 ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ net_rt_iflist для возвращСния списка интСрфСйсов. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² качСствС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±ΡƒΡ„Π΅Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² памяти для записи массива Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… структур if_nameindex. ΠžΡ†Π΅Π½ΠΊΠ° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±ΡƒΡ„Π΅Ρ€Π° нСсколько Π·Π°Π²Ρ‹ΡˆΠ΅Π½Π°, Π½ΠΎ это ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ список интСрфСйсов Π΄Π²Π°ΠΆΠ΄Ρ‹: ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для подсчСта числа интСрфСйсов ΠΈ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠΌΠ΅Π½, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” для записи этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. ΠœΡ‹ создаСм массив if_nameindex Π² Π½Π°Ρ‡Π°Π»Π΅ этого Π±ΡƒΡ„Π΅Ρ€Π° ΠΈ записываСм ΠΈΠΌΠ΅Π½Π° интСрфСйсов, начиная с ΠΊΠΎΠ½Ρ†Π° Π±ΡƒΡ„Π΅Ρ€Π°.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сообщСний RTM_IFINFO

22-36 ΠœΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ всС сообщСния, ΠΈΡ‰Π° сообщСния RTM_IFINFO ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π° Π½ΠΈΠΌΠΈ структуры адрСса сокСта. Имя ΠΈ индСкс интСрфСйса Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² создаваСмый Π½Π°ΠΌΠΈ массив.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ массива

38-39 ΠŸΠΎΡΠ»Π΅Π΄Π½ΡΡ запись Π² массивС ΠΈΠΌΠ΅Π΅Ρ‚ пустой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ if_name ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ индСкс.

Ѐункция if_freenameindex

ПослСдняя функция, показанная Π² листингС 18.13, освобоТдаСт ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° для массива структур if_nameindex ΠΈ хранящихся Π² Π½Π΅ΠΌ ΠΈΠΌΠ΅Π½.

Листинг 18.14. ОсвобоТдСниС памяти, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ if_nameindex

43 void

44 if_freenameindex(struct if_nameindex *ptr)

45 {

46  free(ptr);

47 }

Π­Ρ‚Π° функция Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈ ΠΈ массив структур, ΠΈ ΠΈΠΌΠ΅Π½Π° Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ Π±ΡƒΡ„Π΅Ρ€Π΅. Если Π±Ρ‹ ΠΌΡ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ malloc, Ρ‚ΠΎ для освобоТдСния памяти Π½Π°ΠΌ Π±Ρ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· вСсь массив, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ сам массив (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ free).

18.7. РСзюмС

ПослСдняя ΠΈΠ· структур адрСса сокСта, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΠ»ΠΈΡΡŒ Π² ΠΊΠ½ΠΈΠ³Π΅, это sockaddr_dl β€” структура адрСса сокСта канального уровня, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ. Π―Π΄Ρ€Π° Π‘Π΅Ρ€ΠΊΠ»ΠΈ-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡ… с интСрфСйсами, возвращая Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· этих структур индСкс интСрфСйса, Π΅Π³ΠΎ имя ΠΈ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ адрСс.

Π’ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ сокСт процСссом ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ записаны 5 Ρ‚ΠΈΠΏΠΎΠ² сообщСний, ΠΈ 12 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сообщСний ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ асинхронно Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹ ядром Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ сокСт. ΠœΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° процСсс Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Ρƒ ядра ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ записи Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ядро ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ со всСми подробностями. ΠžΡ‚Π²Π΅Ρ‚Ρ‹ ядра ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎ восьми структур адрСса сокСта, поэтому Π½Π°ΠΌ приходится Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.