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

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

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

β–  SCTP_SHUTDOWN_EVENT

Π­Ρ‚ΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ пСрСдаСтся ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ ΠΎΡ‚ собСсСдника ΠΏΠΎΡ€Ρ†ΠΈΠΈ SHUTDOWN. ПослС этой ΠΏΠΎΡ€Ρ†ΠΈΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π½ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° Ρ‚ΠΎΠΌ ΠΆΠ΅ сокСтС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚. ВсС Π΄Π°Π½Π½Ρ‹Π΅, ΡƒΠΆΠ΅ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Π΅ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ собСсСднику, послС Ρ‡Π΅Π³ΠΎ ассоциация Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°. Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

struct sctp_shutdown_event {

 uint16_t sse_type;

 uint16_t sse_flags;

 uint32_t sse_length;

 sctp_assoc_t sse_assoc_id;

};

ПолС sse_assoc_id содСрТит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ассоциации, которая закрываСтся ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

β–  SCTP_ADAPTION_INDICATION

НСкоторыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ уровня (adaption layer indication). Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ пСрСдаСтся Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… INIT ΠΈ INIT-ACK ΠΈ увСдомляСт собСсСдника ΠΎ выполняСмой Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ прилоТСния. Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

struct sctp_adaption_event {

 u_int16_t sai_type;

 u_int16_t sai_flags;

 u_int32_t sai_length;

 u_int32_t sai_adaption_ind;

 sctp_assoc_t sai_assoc_id;

};

ПолС sai_assoc_id содСрТит ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ассоциации. ПолС sai_adaption_ind прСдставляСт собой 32-разрядноС Ρ†Π΅Π»ΠΎΠ΅ число, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ΅ собСсСдником локальной ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ Π² сообщСнии INIT ΠΈΠ»ΠΈ INIT-ACK. Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ для исходящих сообщСний устанавливаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° сокСта SCTP_ADAPTION_LAYER (см. Ρ€Π°Π·Π΄Π΅Π» 7.10). ВсС это описано Π² стандартС [116], Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° для ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ прямого доступа ΠΊ памяти ΠΈ прямой записи Π΄Π°Π½Π½Ρ‹Ρ… описываСтся Π² [115].

β–  SCTP_PARTIAL_DELIVERY_EVENT

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ частичной доставки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… сообщСний ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Ρ‡Π΅Ρ€Π΅Π· Π±ΡƒΡ„Π΅Ρ€ сокСта. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ процСсс ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» сообщСниС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 4 ΠœΠ±Π°ΠΉΡ‚. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ сильно ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ систСмныС рСсурсы. РСализация SCTP Π½Π΅ смогла Π±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС, Ссли Π±Ρ‹ Ρƒ Π½Π΅Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° доставки сообщСний ΠΏΠΎ частям Π΄ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΡ… получСния. РСализация, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π°Ρ Ρ‡Π°ΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ доставку, называСтся интСрфСйсом частичной доставки (partial delivery API). SCTP ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, Π½Π΅ устанавливая Ρ„Π»Π°Π³ΠΈ Π² ΠΏΠΎΠ»Π΅ msg_flags Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² послСдний сСгмСнт сообщСния. Для этого сСгмСнта устанавливаСтся Ρ„Π»Π°Π³ MSG_EOR (ΠΊΠΎΠ½Π΅Ρ† записи). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ рассчитываСт ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ большиС сообщСния, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvmsg ΠΈ sctp_recvmsg, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ msg_flags Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ„Π»Π°Π³Π° окончания записи.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях интСрфСйсу частичной доставки ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎ состоянии сообщСния. НапримСр, Ссли ΠΏΡ€ΠΈ доставкС большого сообщСния ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» сбой, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ доставляСтся ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ SCTP_PARTIAL_DELIVERY_EVENT, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

struct sctp_pdapi_event {

 uint16_t pdapi_type;

 uint16_t pdapi_flags;

 uint32_t pdapi_length;

 uint32_t pdapi_indication;

 sctp_assoc_t pdapi_assoc_id;

};

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ pdapi_assoc_id ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π°ΡΡΠΎΡ†ΠΈΠ°Ρ†ΠΈΡŽ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ относится принятоС ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅. ПолС pdapi_indication содСрТит свСдСния ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠ΅ΠΌ событии. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ СдинствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SCTP_PARTIAL_DELIVERY_ABORTED, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ Π½Π° Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ частичной доставки сообщСния, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

9.15. РСзюмС

SCTP ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄Π²Π° Π²ΠΈΠ΄Π° интСрфСйсов: Β«ΠΎΠ΄ΠΈΠ½-ΠΊ-ΠΎΠ΄Π½ΠΎΠΌΡƒΒ», ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… TCP-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° SCTP, ΠΈ Β«ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ», Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ всС Π½ΠΎΠ²Ρ‹Π΅ возмоТности SCTP. Ѐункция sctp_peeloff позволяСт Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ассоциации ΠΈΠ· мноТСствСнных сокСтов Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, SCTP прСдоставляСт мноТСство ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ событиях транспортного уровня, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ нСобходимости ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ. Бобытия ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ассоциациями, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» SCTP ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° многоинтСрфСйсныС ΡƒΠ·Π»Ρ‹, Π½Π΅ всС стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сокСтов, рассмотрСнныС Π² Π³Π»Π°Π²Π΅ 4, ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ эффСктивны ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌ. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ sctp_bindx, sctp_connectx, sctp_getladdrs ΠΈ sctp_getpaddrs ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ адрСсами ΠΈ ассоциациями. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ sctp_sendmsg ΠΈ sctp_recvmsg ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ использованиС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… возмоТностСй SCTP. Π’ Π³Π»Π°Π²Π°Ρ… 10 ΠΈ 23 ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, наглядно Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ рассмотрСнныС Π² этой Π³Π»Π°Π²Π΅ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ.

УпраТнСния

1. Π’ ΠΊΠ°ΠΊΠΎΠΉ ситуации Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прилоТСния скорСС всСго Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ sctp_peeloff?

2. Π“оворя ΠΎ сокСтах Ρ‚ΠΈΠΏΠ° Β«ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ», ΠΌΡ‹ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° сторонС сСрвСра Ρ‚Π°ΠΊΠΆΠ΅ происходит автоматичСскоС Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅. ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π΅Ρ€Π½ΠΎ?

3. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ рукопоТатия Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для сокСтов Ρ‚ΠΈΠΏΠ° Β«ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ»? (Подсказка: Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π²ΠΎ врСмя установки ассоциации.)

4. Π’ ΠΊΠ°ΠΊΠΎΠΉ ситуации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… чСтырСхэтапного рукопоТатия?

5. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 9.7 говорится ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… адрСсов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ подмноТСством связанных адрСсов. Π’ ΠΊΠ°ΠΊΠΎΠΉ ситуации это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ?

Π“Π»Π°Π²Π° 10

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ SCTP-соСдинСния ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр

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

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ элСмСнтарными функциями ΠΈΠ· Π³Π»Π°Π² 4 ΠΈ 9 для написания ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ прилоТСния SCTP с Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр Ρ‚ΠΈΠΏΠ° Β«ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ». Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΈΠ· нашСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ эхо-сСрвСру ΠΈΠ· Π³Π»Π°Π²Ρ‹ 5. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

1. ΠšΠ»ΠΈΠ΅Π½Ρ‚ считываСт строку тСкста ΠΈΠ· стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈ отсылаСт Π΅Π΅ сСрвСру. Π‘Ρ‚Ρ€ΠΎΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ [#]text, Π³Π΄Π΅ Π½ΠΎΠΌΠ΅Ρ€ Π² скобках ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° SCTP, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΎ это тСкстовоС сообщСниС.

2. Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ тСкстовоС сообщСниС ΠΈΠ· сСти, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ сообщСниС, Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ ΠΈ отправляСт сообщСниС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡ‚ΠΎΠΊ с Π½ΠΎΠ²Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ.

3. ΠšΠ»ΠΈΠ΅Π½Ρ‚ считываСт ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ строку ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΅Π΅ Π² стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π°, добавляя ΠΊ Π½Π΅ΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ порядковый Π½ΠΎΠΌΠ΅Ρ€ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

НашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ вмСстС с функциями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΎ Π½Π° рис. 10.1.

Рис. 10.1. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ SCTP с Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр

Π”Π²Π΅ стрСлки ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Π΄Π²Π° ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ° (ассоциация Π² Ρ†Π΅Π»ΠΎΠΌ являСтся ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ двустороннСй). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ fgets ΠΈ fputs входят Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. ΠœΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ функциями writen ΠΈ readline ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° 3.9, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π½ΠΈΡ… Π½Π΅Ρ‚ нСобходимости. ВмСсто Π½ΠΈΡ… ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ sctp_sendmsg ΠΈ sctp_recvmsg ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² 9.9 ΠΈ 9.10 соотвСтствСнно.

Π‘Π΅Ρ€Π²Π΅Ρ€ Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΈΠΏΡƒ Β«ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ». Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ Π½Π°ΠΌΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΈΠ· Π³Π»Π°Π²Ρ‹ 5 ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Π½Ρ‹ ΠΏΠΎΠ΄ SCTP внСсСниСм ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: достаточно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² socket, ΡƒΠΊΠ°Π·Π°Π² Π² качСствС Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° IPPROTO_SCTP вмСсто IPPROTO_TCP. Однако ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π΅ использовало Π±Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности, прСдоставляСмыС SCTP, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ многоинтСрфСйсных ΡƒΠ·Π»ΠΎΠ². Написав сСрвСр Ρ‚ΠΈΠΏΠ° Β«ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ», ΠΌΡ‹ смогли ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ всС достоинства SCTP.

10.2. ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ эхо-сСрвСр SCTP Ρ‚ΠΈΠΏΠ° Β«ΠΎΠ΄ΠΈΠ½-ΠΊΠΎ-ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ»: функция main

Наши ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр SCTP Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, прСдставлСнной Π½Π° рис. 9.2. Код ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ сСрвСра прСдставлСн Π² листингС 10.1[1].

Листинг 10.1. ΠŸΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ эхо-сСрвСр SCTP

//sctp/sctpserv01.c

 1 #include "unp.h"

 2 int

 3 main(int argc, char **argv)

 4 {

 5  int sock_fd, msg_flags;

 6  char readbuf[BUFFSIZE];

 7  struct sockaddr_in servaddr, cliaddr;

 8  struct sctp_sndrcvinfo sri;

 9  struct sctp_event_subscribe evnts;

10  int stream_increment=1;

11  socklen_t len;

12  size_t rd_sz;


13  if (argc == 2)

14   stream_increment = atoi(argv[1]);

15  sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

16  bzero(&servaddr, sizeof(servaddr));

17  servaddr.sin_family = AF_INET;

18  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

19  servaddr.sin_port = htons(SERV_PORT);


20  Bind(sock_fd, (SA*)&servaddr, sizeof(servaddr));


21  bzero(&evnts, sizeof(evnts));

22  evnts.sctp_data_io_event = 1;

23  Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof(evnts));


24  Listen(sock_fd, LISTENQ);

25  for (;;) {

26   len = sizeof(struct sockaddr_in);

27   rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),

28    (SA*)&cliaddr, &len, &sri, &msg_flags);

29   if (stream_increment) {