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

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

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

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ IPv4 TTL ΠΈ Π·Π°ΠΊΠΎΠ»ΡŒΡ†ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° u_char, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ IPv6-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΡ€Π΅Π΄Π΅Π»Π° Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² ΠΈ Π·Π°ΠΊΠΎΠ»ΡŒΡ†ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ соотвСтствСнно Ρ‚ΠΈΠΏΠ° int ΠΈ u_int. РаспространСнная ошибка программирования с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ IPv4 β€” Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setsockopt с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ‚ΠΈΠΏΠ° int для задания TTL ΠΈΠ»ΠΈ Π·Π°ΠΊΠΎΠ»ΡŒΡ†ΠΎΠ²ΠΊΠΈ (Ρ‡Ρ‚ΠΎ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ [128, с. 354–355]), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сокСтов, прСдставлСнных Π² Ρ‚Π°Π±Π». 7.1, ΠΈΠΌΠ΅ΡŽΡ‚ цСлочислСнныС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. ИзмСнСния, внСсСнныС Π² IPv6, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ошибок.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ опишСм ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· дСвяти ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сокСтов Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эти Π΄Π΅Π²ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ Π² IPv4 ΠΈ IPv6 β€” Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… названия ΠΈ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

β–  IP_ADD_MEMBERSHIP, IPV6_JOIN_GROUP, MCAST_JOIN_GROUP. НазначСниС этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² β€” присоСдинСниС ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ локальном интСрфСйсС. ΠœΡ‹ Π·Π°Π΄Π°Π΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΅Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… адрСсов для IPv4 ΠΈΠ»ΠΈ индСксом интСрфСйса для IPv6. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ структуры ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ присоСдинСнии ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ отсоСдинСнии ΠΎΡ‚ Π½Π΅Π΅:

struct ip_mreq {

 struct in_addr imr_multiaddr; /* IPv4-адрСс многоадрСсной

                                  ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ класса D */

 struct in_addr imr_interface; /* IPv4-адрСс локального

                                  интСрфСйса */

};


struct ipv6_mreq {

 struct in6_addr ipv6mr_multiaddr; /* IPv6-адрСс многоадрСсной

                                      ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ */

 unsigned int ipv6mr_interface;    /* индСкс интСрфСйса ΠΈΠ»ΠΈ 0 */

};


struct group_req {

 unsigned int gr_interface;        /* индСкс интСрфСйса ΠΈΠ»ΠΈ 0 */

 struct sockaddr_storage gr_group; /* адрСс многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ

                                      IPv4 ΠΈΠ»ΠΈ IPv6 */

};

Если Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс задаСтся ΠΊΠ°ΠΊ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс (INADDR_ANY для IPv4) ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ индСкс IPv6, Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс выбираСтся ядром.

ΠœΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠ·Π΅Π» ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ Π΄Π°Π½Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ интСрфСйсС, Ссли ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ процСссов Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΊ этой Π³Ρ€ΡƒΠΏΠΏΠ΅ Π½Π° этом интСрфСйсС.

Π‘ΠΎΠΊΠ΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присоСдинСн ΠΊ нСскольким Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ, Π½ΠΎ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ присоСдинСн ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс ΠΈΠ»ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс. Π­Ρ‚ΠΎ свойство ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° ΡƒΠ·Π»Π΅ с нСсколькими сСтСвыми интСрфСйсами: создаСтся ΠΎΠ΄ΠΈΠ½ сокСт, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присваиваСтся ΠΎΠ΄ΠΈΠ½ адрСс многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ, Π½ΠΎ благодаря Π½Π°Π»ΠΈΡ‡ΠΈΡŽ Ρ€Π°Π·Π½Ρ‹Ρ… интСрфСйсов этот сокСт ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присоСдинСн ΠΊ Ρ€Π°Π·Π½Ρ‹ΠΌ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ.

ВспомнитС ΠΈΠ· Ρ‚Π°Π±Π». 21.1, Ρ‡Ρ‚ΠΎ Ρ‡Π°ΡΡ‚ΡŒΡŽ адрСса многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ IPv6 являСтся ΠΏΠΎΠ»Π΅ области дСйствия. Как ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΈ, адрСса многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ IPv6, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ дСйствия, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ссли рСализация ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° синхронизации Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (network time protocol, NTP) Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ NTP нСзависимо ΠΎΡ‚ ΠΈΡ… области дСйствия, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ ΠΊ адрСсу ff01:101 (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΡƒΠ·Π»Π°), ff02:101 (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… физичСской сСти), ff05:101 (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… сайта), ff08:101 (Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ) ΠΈ ff0e:101 (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ). ВсС присоСдинСния ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ сокСтС. МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта IPV6_PKTINFO (см. Ρ€Π°Π·Π΄Π΅Π» 22.8), Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция recvmsg Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° адрСс получатСля ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹.

НСзависимый ΠΎΡ‚ вСрсии IP ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта (MCAST_JOIN_GROUP) Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ IPv6 Π·Π° Ρ‚Π΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ структуру sockaddr_storage вмСсто in6_addr для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ адрСса ядру. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° sockaddr_storage (см. листинг 3.4) достаточно Π²Π΅Π»ΠΈΠΊΠ° для хранСния адрСса любой вСрсии, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠΉ систСмой.

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

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ число присоСдинСний, допустимых для ΠΎΠ΄Π½ΠΎΠ³ΠΎ сокСта, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ. ΠŸΡ€Π΅Π΄Π΅Π» опрСдСляСтся константой IP_MAX_MEMBERSHIPS (для Π‘Π΅Ρ€ΠΊΠ»ΠΈ-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 20). Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… рСализациях это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ снято, Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для Π‘Π΅Ρ€ΠΊΠ»ΠΈ-Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ.

Когда интСрфСйс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ присоСдинСниС, Π½Π΅ Π·Π°Π΄Π°Π½, Π‘Π΅Ρ€ΠΊΠ»ΠΈ-ядра ΠΈΡ‰ΡƒΡ‚ адрСс многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ IP ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ интСрфСйс [128, с. 357]. НСкоторыС систСмы для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ этой ситуации ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ для всСх адрСсов многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ с адрСсом получатСля 224.0.0.0/8 для IPv4) Π² процСссС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Для IPv6 сдСлано ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ β€” ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ интСрфСйса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ индСкс, Π° Π½Π΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ Π² IPv4. Π­Ρ‚ΠΎ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ присоСдинСниС Π½Π° Π½Π΅Π½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… интСрфСйсах ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… Ρ‚ΡƒΠ½Π½Π΅Π»Π΅ΠΉ.

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π² API многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ IPv6 использовалась константа IPV6_ADD_MEMBERSHIP, Π° Π½Π΅ IPV6_JOIN_GROUP. Π’ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ… интСрфСйс программирования Π½Π΅ измСнился. Описанная Π΄Π°Π»Π΅Π΅ функция mcast_join скрываСт это ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅.

β–  IP_DROP_MEMBERSHIP, IPV6_LEAVE_GROUP ΠΈ MCAST_LEAVE_GROUP. НазначСниС этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² β€” Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ локальном интСрфСйсС. Π‘ этими ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ сокСта ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚Π΅ ΠΆΠ΅ структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ для присоСдинСния ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅. Если Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс Π½Π΅ Π·Π°Π΄Π°Π½ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ INADDR_ANY для IPv4 ΠΈΠ»ΠΈ индСкс интСрфСйса Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ для IPv6), удаляСтся ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π΅ с искомым Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ.

Если процСсс присоСдинился ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅, Π½ΠΎ Π½Π΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠ» ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ явно, Ρ‚ΠΎ ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ сокСта (Π»ΠΈΠ±ΠΎ явном, Π»ΠΈΠ±ΠΎ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ процСсса) Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ прСкращаСтся автоматичСски. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ситуация, ΠΊΠΎΠ³Π΄Π° нСсколько процСссов Π½Π° ΡƒΠ·Π»Π΅ ΠΏΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠ»ΠΈΡΡŒ ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π³Ρ€ΡƒΠΏΠΏΠ΅, ΠΈ Π² этом случаС ΡƒΠ·Π΅Π» остаСтся Ρ‡Π»Π΅Π½ΠΎΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΏΠΎΠΊΠ° послСдний процСсс Π½Π΅ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹.

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

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π² API многоадрСсной ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ IPv6 использовалась константа IPV6_DROP_MEMBERSHIP, Π° Π½Π΅ IPV6_LEAVE_GROUP. Π’ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΡ… интСрфСйс программирования Π½Π΅ измСнился. Описанная Π΄Π°Π»Π΅Π΅ функция mcast_leave скрываСт это ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅.

β–  IP_BLOCK_SOURCE, MCAST_BLOCK_SOURCE. Π‘Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Ρ‡Π΅Ρ€Π΅Π· Π΄Π°Π½Π½Ρ‹ΠΉ сокСт ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ источника для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ интСрфСйса. Если всС сокСты, присоСдинСнныС ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ источник, систСма ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ многоадрСсного Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Π² сСти. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс задаСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΅Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… адрСсов для IPv4 ΠΈΠ»ΠΈ индСксом для нСзависимого ΠΎΡ‚ вСрсии API. Для блокирования ΠΈ разблокирования источника ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π²Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ структуры:

struct ip_mreq_source {

 struct in_addr imr_multiaddr;  /* IPv4-адрСс многоадрСсной

                                   ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ класса D */

 struct in_addr imr_sourceaddr; /* IPv4-адрСс источника */

 struct in_addr imr_interface;  /* IPv4-адрСс локального

                                   интСрфСйса */

};


struct group_source_req {

 unsigned int gsr_interface;         /* индСкс интСрфСйса ΠΈΠ»ΠΈ 0 */

 struct sockaddr_storage gsr_group;  /* адрСс многоадрСсной

                                        ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ IPv4 ΠΈΠ»ΠΈ IPv6 */

 struct sockaddr_storage gsr_source; /* адрСс источника IPv4

                                        ΠΈΠ»ΠΈ IPv6 */

};

Если Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс задаСтся ΠΊΠ°ΠΊ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс (INADDR_ANY для IPv4) ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ индСкс IPv6, Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс выбираСтся ядром.

Запрос Π½Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ источника дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для присоСдинСнных Π³Ρ€ΡƒΠΏΠΏ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ присоСдинСны ΠΊ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ интСрфСйсу ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ IP_ADD_MEMBERSHIP, IPV6_JOIN_GROUP ΠΈΠ»ΠΈ MCAST_JOIN_GROUP.

β–  IP_UNBLOCK_SOURCE, MCAST_UNBLOCK_SOURCE. Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π½Π΅Π΅ источника. АргумСнты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² точности Ρ‚Π΅ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠ΅Π³ΠΎ запроса IP_BLOCK_SOURCE ΠΈΠ»ΠΈ MCAST_BLOCK_SOURCE.

Если Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс задаСтся ΠΊΠ°ΠΊ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс (INADDR_ANY для IPv4) ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ индСкс IPv6, Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс выбираСтся ядром.

β–  IP_ADD_SOURCE_MEMBERSHIΠ , MCAST_JOIN_SOURCE_GROUP. ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ источника Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ локальном интСрфСйсС. Π‘ этим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π΅ ΠΆΠ΅ структуры, Ρ‡Ρ‚ΠΎ ΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ блокирования ΠΈ разблокирования источника. Π‘ΠΎΠΊΠ΅Ρ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ присоСдинСн ΠΊ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π³Ρ€ΡƒΠΏΠΏΠ΅ Π±Π΅Π· указания источника (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ IP_ADD_MEMBERSHIP, IPV6_JOIN_GROUP, MCAST_JOIN_GROUP).

Если Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс задаСтся ΠΊΠ°ΠΊ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс (INADDR_ANY для IPv4) ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ индСкс IPv6, Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс выбираСтся ядром.

β–  IP_DROP_SOURCE_MEMBERSHIP, MCAST_LEAVE_SOURCE_GROUP. ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Π³Ρ€ΡƒΠΏΠΏΡ‹ источника ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ локального интСрфСйса. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚Π΅ ΠΆΠ΅ структуры, Ρ‡Ρ‚ΠΎ ΠΈ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ сокСтов. Если Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INADDR_ANY для IPv4 ΠΈΠ»ΠΈ 0 для нСзависимого ΠΎΡ‚ вСрсии API), ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ пСрвая Π³Ρ€ΡƒΠΏΠΏΠ°, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π°Ρ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ значСниям.