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

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

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

5. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ исходный ΠΊΠΎΠ΄ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π² этой ΠΊΠ½ΠΈΠ³Π΅ (см. прСдисловиС) ΠΈ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ sock (см. Ρ€Π°Π·Π΄Π΅Π» Π’.3). Π‘Π½Π°Ρ‡Π°Π»Π° классифицируйтС свой ΡƒΠ·Π΅Π» ΠΊΠ°ΠΊ ΡƒΠ·Π΅Π», Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠ°Π΄Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ, Π·Π°Ρ‚Π΅ΠΌ β€” ΠΊΠ°ΠΊ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠ°Π΄Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ, Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ SO_REUSEPORT, ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΊΠ°ΠΊ ΡƒΠ·Π΅Π», ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠ°Π΄Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ с прСдоставлСниСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° SO_REUSEPORT. ΠŸΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ нСсколько экзСмпляров ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ sock Π² качСствС сСрвСра TCP (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -s ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки) Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡ€Ρ‚Π΅, связывая ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· адрСсов интСрфСйсов вашСго ΡƒΠ·Π»Π° ΠΈ адрСс Π·Π°ΠΊΠΎΠ»ΡŒΡ†ΠΎΠ²ΠΊΠΈ (loopback address). НуТно Π»ΠΈ Π²Π°ΠΌ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ SO_REUSEADDR (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -А ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки)? Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ netstat для просмотра ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… сокСтов.

6. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΎ запуститС сСрвСр UDP (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -u ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки) ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Π²Π° экзСмпляра, связанныС с ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ IP-адрСсом ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠΌ. Если ваша рСализация ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ SO_REUSEPORT, ΠΏΠΎΠΏΡ‹Ρ‚Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -T ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки).

7. ΠœΠ½ΠΎΠ³ΠΈΠ΅ вСрсии ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ping ΠΈΠΌΠ΅ΡŽΡ‚ Ρ„Π»Π°Π³ -d, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта SO_DEBUG. Π’ Ρ‡Π΅ΠΌ Π΅Π³ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅?

8. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΊΠΎΠ½Ρ†Π΅ нашСго обсуТдСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° сокСта TCP_NODELAY, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ выполняСт Π΄Π²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ записи с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ write: ΠΏΠ΅Ρ€Π²ΡƒΡŽ для 4 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²Ρ‚ΠΎΡ€ΡƒΡŽ для 396 Π±Π°ΠΉΡ‚. Π’Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ врСмя Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ACK β€” 100 мс, ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ RTT ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром Ρ€Π°Π²Π΅Π½ 100 мс, Π° врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сСрвСром ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ клиСнтского запроса β€” 50 мс. НарисуйтС Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ взаимодСйствиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Нагла с Π·Π°Π΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹ΠΌΠΈ сСгмСнтами ACK.

9. Π‘Π½ΠΎΠ²Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅, считая, Ρ‡Ρ‚ΠΎ установлСн ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта TCP_NODELAY.

10. Π‘Π½ΠΎΠ²Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8, считая, Ρ‡Ρ‚ΠΎ процСсс Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ writev ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΎΠ±ΠΎΠΈΡ… Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² (4-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΈ 396-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎΠ³ΠΎ).

11. ΠŸΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ RFC 1122 [10], Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» для Π·Π°Π΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹Ρ… сСгмСнтов ACK.

12. Π’ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· вСрсий наш сСрвСр Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ β€” Π² листингС 5.1 ΠΈΠ»ΠΈ 5.2? Π§Ρ‚ΠΎ происходит, Ссли сСрвСр устанавливаСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта SO_KEEPALIVE, Ρ‡Π΅Ρ€Π΅Π· соСдинСниС Π½Π΅ происходит ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΡƒΠ·Π΅Π» ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· строя ΠΈ Π½Π΅ пСрСзагруТаСтся?

13. Π’ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· вСрсий наш ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ β€” Π² листингС 5.3 ΠΈΠ»ΠΈ 5.4? Π§Ρ‚ΠΎ происходит, Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ устанавливаСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта SO_KEEPALIVE, Ρ‡Π΅Ρ€Π΅Π· соСдинСниС Π½Π΅ происходит ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΡƒΠ·Π΅Π» сСрвСра Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· строя ΠΈ Π½Π΅ пСрСзагруТаСтся?

14. Π’ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· вСрсий наш ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ β€” Π² листингС 5.3 ΠΈΠ»ΠΈ 6.2? Π§Ρ‚ΠΎ происходит, Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚ устанавливаСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта SO_KEEPALIVE, Ρ‡Π΅Ρ€Π΅Π· соСдинСниС Π½Π΅ происходит ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΡƒΠ·Π΅Π» сСрвСра Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· строя ΠΈ Π½Π΅ пСрСзагруТаСтся?

15. Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΈ сСрвСр ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сокСта SO_KEEPALIVE. ΠœΠ΅ΠΆΠ΄Ρƒ собСсСдниками поддСрТиваСтся соСдинСниС, Π½ΠΎ Ρ‡Π΅Ρ€Π΅Π· это соСдинСниС Π½Π΅ происходит ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями. Когда проходят условлСнныС 2 Ρ‡ ΠΈ трСбуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ связи, сколькими сСгмСнтами TCP ΠΎΠ±ΠΌΠ΅Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ собСсСдники?

16. ΠŸΠΎΡ‡Ρ‚ΠΈ всС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ константу SO_ACCEPTCONN Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <sys/socket.h>, Π½ΠΎ ΠΌΡ‹ Π½Π΅ описывали этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. ΠŸΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ [69], Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π·Π°Ρ‡Π΅ΠΌ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ сущСствуСт.

Π“Π»Π°Π²Π° 8

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ свСдСния ΠΎ сокСтах UDP

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

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ TCP ΠΈ UDP, Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ UDP являСтся Π½Π΅Π½Π°Π΄Π΅ΠΆΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ, Π½Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π½Π° установлСниС соСдинСния, ΠΈ этим ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Π½Π΅ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° установлСниС соСдинСния ΠΈ Π½Π°Π΄Π΅ΠΆΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ² TCP. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π΅ΡΡ‚ΡŒ случаи, ΠΊΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ UDP вмСсто TCP. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ случаи ΠΌΡ‹ рассматриваСм Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 22.4. НСкоторыС популярныС прилоТСния построСны с использованиСм UDP, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ DNS (Domain Name System β€” систСма Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½), NFS (сСтСвая файловая систСма β€” Network File System) ΠΈ SNMP (Simple Network Management Protocol β€” простой ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» управлСния ΡΠ΅Ρ‚ΡŒΡŽ).

На рис. 8.1 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΉ схСмы ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр UDP. ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π½Π΅ устанавливаСт соСдинСния с сСрвСром. ВмСсто этого ΠΊΠ»ΠΈΠ΅Π½Ρ‚ лишь отправляСт сСрвСру Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sendto (ΠΎΠ½Π° описываСтся Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ адрСс получатСля (сСрвСра) Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Аналогично, сСрвСр Π½Π΅ устанавливаСт соСдинСния с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. ВмСсто этого сСрвСр лишь Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ recvfrom, которая ΠΆΠ΄Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ΄ΡƒΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Ѐункция recvfrom Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ адрСс ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°) вмСстС с Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прислал Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ.

Рис. 8.1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ сокСта для ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр UDP

Рисунок 8.1 ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠ³ΠΎ сцСнария ΠΎΠ±ΠΌΠ΅Π½Π° UDP-Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±ΠΌΠ΅Π½ΠΎΠΌ ΠΏΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ TCP, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΌ Π½Π° рис. 4.1.

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ опишСм Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, примСняСмыС с сокСтами UDP, β€” recvfrom ΠΈ sendto, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Π΅ΠΌ Π½Π°ΡˆΡƒ модСль ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСр для примСнСния UDP. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ рассмотрим использованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect с сокСтом UDP ΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ асинхронных ошибок.

8.2. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom ΠΈ sendto

Π­Ρ‚ΠΈ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ стандартным функциям read ΠΈ write, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Ρ‚Ρ€Π΅Ρ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

#include <sys/socket.h>


ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags,

 struct sockaddr *from, socklen_t *addrlen);

ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,

 const struct sockaddr *to, socklen_t addrlen);

ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ количСство записанных ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ² Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния, -1 Π² случаС ошибки

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, sockfd, buff ΠΈ nbytes, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Ρ‚Ρ€Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ read ΠΈ write: дСскриптор, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±ΡƒΡ„Π΅Ρ€, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ производится Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ происходит запись, ΠΈ число Π±Π°ΠΉΡ‚ΠΎΠ² для чтСния ΠΈΠ»ΠΈ записи.

ΠœΡ‹ расскаТСм ΠΎΠ± Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ flags Π² Π³Π»Π°Π²Π΅ 14, Π³Π΄Π΅ ΠΌΡ‹ рассматриваСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recv, send, recvmsg ΠΈ sendmsg, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сСйчас Π² нашСм простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. Пока ΠΌΡ‹ всСгда Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ flags Π² Π½ΡƒΠ»ΡŒ.

АргумСнт to для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sendto β€” это структура адрСса сокСта, содСрТащая адрСс ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, IP-адрСс ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°) адрСсата. Π Π°Π·ΠΌΠ΅Ρ€ этой структуры адрСса сокСта задаСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ addrlen. Ѐункция recvform заполняСт структуру адрСса сокСта, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ from, записывая Π² Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΡŒΠ½Ρ‹ΠΉ адрСс отправитСля Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹. Число Π±Π°ΠΉΡ‚ΠΎΠ², хранящихся Π² структурС адрСса сокСта, Ρ‚Π°ΠΊΠΆΠ΅ возвращаСтся Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌΡƒ процСссу Π² Ρ†Π΅Π»ΠΎΠΌ числС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ addrlen. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ послСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sendto являСтся цСлочислСнным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ послСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom β€” это ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ†Π΅Π»ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚ΠΈΠΏΠ° Β«Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅-Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Β»).

ПослСдниС Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ Π΄Π²ΡƒΠΌ послСдним Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ accept: содСрТимоС структуры адрСса сокСта ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ сообщаСт Π½Π°ΠΌ, ΠΊΡ‚ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ (Π² случаС UDP) ΠΈΠ»ΠΈ ΠΊΡ‚ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π» соСдинСниС (Π² случаС TCP). ПослСдниС Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sendto Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ Π΄Π²ΡƒΠΌ послСдним Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ connect: ΠΌΡ‹ заполняСм структуру адрСса сокСта ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΡŒΠ½Ρ‹ΠΌ адрСсом получатСля Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ (Π² случаС UDP) ΠΈΠ»ΠΈ адрСсом ΡƒΠ·Π»Π°, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ соСдинСниС (Π² случаС TCP).

ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π² качСствС значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π»ΠΈΠ½Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Ρ‹ ΠΈΠ»ΠΈ записаны. ΠŸΡ€ΠΈ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎΠΌ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” это объСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ΅.

Π”Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ. Π’ случаС UDP ΠΏΡ€ΠΈ этом возвращаСтся Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° IP, содСрТащая Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ IP (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 20 Π±Π°ΠΉΡ‚ для IPv4 ΠΈΠ»ΠΈ 40 Π±Π°ΠΉΡ‚ для IPv6), 8-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ UDP ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ: ΠΎΠ½ΠΎ Π½Π΅ являСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ собСсСдник Π·Π°ΠΊΡ€Ρ‹Π» соСдинСниС, ΠΊΠ°ΠΊ это происходит ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ значСния ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read Π½Π° сокСтС TCP. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» UDP Π½Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° установлСниС соСдинСния, Ρ‚ΠΎ Π² Π½Π΅ΠΌ ΠΈ Π½Π΅ сущСствуСт Ρ‚Π°ΠΊΠΎΠ³ΠΎ события, ΠΊΠ°ΠΊ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ соСдинСния.

Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ from Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvfrom являСтся пустым ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΄Π»ΠΈΠ½Ρ‹ (addrlen) Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ пустым ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΈ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ нас Π½Π΅ интСрСсуСт адрСс отправитСля Π΄Π°Π½Π½Ρ‹Ρ….