ΠΠΎΠ±ΡΡΠΉ Π΄Π΅Π½Ρ! ΠΡΠ΅Π΄Π»Π°Π³Π°Ρ Π²Π°ΡΠ΅ΠΌΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ ΠΊΠ½ΠΈΠ³Ρ «Linux API. ΠΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠ΅Π΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ»(ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ ΠΊΠ½ΠΈΠ³ΠΈ The Linux Programming Interface). ΠΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΠ°Π·Π°ΡΡ Π½Π° ΡΠ°ΠΉΡΠ΅ ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΡΡΠ²Π°, ΠΈ Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΏΡΠΎΠΌΠΎΠΊΠΎΠ΄ LinuxAPI , ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠΊΠΈΠ΄ΠΊΡ 30%.
ΠΡΡΡΠ²ΠΎΠΊ ΠΈΠ· ΠΊΠ½ΠΈΠ³ΠΈ Π΄Π»Ρ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΡ:
Π‘ΠΎΠΊΠ΅ΡΡ: Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°
Π ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ Π΄Π΅ΠΌΠΎΠ½ inetd, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΡ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
ΠΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π²Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠ΅ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΡΠ΅ΡΠ΅Π²ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠΊΠ΅ΡΠΎΠ²:
-
ΠΈΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ: ΡΠ΅ΡΠ²Π΅Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ, ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Ρ Π·Π°ΠΏΡΠΎΡ (ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΡΠΎΡΠΎΠ²) ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Ρ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ;
-
ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½Π°Ρ: ΡΠ΅ΡΠ²Π΅Ρ ΡΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ Π΄Π»Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
Π ΡΠ°Π·Π΄Π΅Π»Π΅ 44.8 ΡΠΆΠ΅ Π±ΡΠ» ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ FIFO.
ΠΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΈΡΡΠ°ΡΠΈΡΡ , ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΡΡΡΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½ ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΠ±ΡΠ»ΡΠΆΠ°Ρ Π»ΡΠ±ΡΡ Π΄ΡΡΠ³ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², Π½Π°Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π½ΠΈΠΌ. ΠΠ±ΡΡΠ½ΡΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΠΌΠ΅Π½ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΠΌΠΈ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ ΠΈ ΠΎΡΠ²Π΅ΡΠ°ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
ΠΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π² ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΡΡ ΠΎΠ΄ΠΈΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΎΠ±ΠΌΠ΅Π½ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ. Π Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠΎΡΡΠ΅Π΄ΠΎΡΠΎΡΠΈΠΌΡΡ Π½Π° ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎΠΌ (ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΌ) ΡΠΏΠΎΡΠΎΠ±Π΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π’Π°ΠΊΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π²ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΡΠ΅Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΡΠ½ΠΎΠ²Π½Π°Ρ Π·Π°Π΄Π°ΡΠ° Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° (ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ) Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (ΠΊΠ°ΠΊ Π²Π°ΡΠΈΠ°Π½Ρ, Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΠΎΡΠΎΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ).
Π ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ°Π·Π΄Π΅Π»Π°Ρ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠΎΠΊΠ΅ΡΠΎΠ² ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-Π΄ΠΎΠΌΠ΅Π½Π°. ΠΡΠΈ Π΄Π²Π° ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΡΠΏΡΠΎΡΠ΅Π½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ»ΡΠΆΠ±Ρ echo (RFC 862), ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠΏΠΈΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠ»Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ.
ΠΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ UDP-ΡΠ΅ΡΠ²Π΅Ρ echo
Π ΡΡΠΎΠΌ ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΡ Π΄Π»Ρ ΡΠ»ΡΠΆΠ±Ρ echo. ΠΠ½Π° Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π° ΠΏΠΎΡΡΠ΅ Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ 7 ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ ΠΏΠΎ UDP, ΡΠ°ΠΊ ΠΈ ΠΏΠΎ TCP (Π΄Π°Π½Π½ΡΠΉ ΠΏΠΎΡΡ Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½, Π² ΡΠ²ΡΠ·ΠΈ Ρ ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅Ρ echo Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Ρ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΌΠΈ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°).
UDP-ΡΠ΅ΡΠ²Π΅Ρ echo ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΠΈΡ ΠΊΠΎΠΏΠΈΠΈ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΡΠ²Π΅ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π·Π° ΡΠ°Π·, Π·Π΄Π΅ΡΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 56.1.
ΠΠΈΡΡΠΈΠ½Π³ 56.1. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Π΄Π»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ id_echo_sv.c ΠΈ id_echo_cl.c
#include "inet_sockets.h" /* ΠΠ±ΡΡΠ²Π»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°ΡΠ΅Π³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° */
#include "tlpi_hdr.h"
#define SERVICE "echo" /* ΠΠΌΡ UDP-ΡΠ»ΡΠΆΠ±Ρ */
#define BUF_SIZE 500 /* ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅
ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΡΠΎΡΠΈΡΠ°Π½Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ */
____________________________________________________________________sockets/id_echo.h
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 56.2 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ°. Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ:
-
Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌ Π΄Π΅ΠΌΠΎΠ½Π° ΠΌΡ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ becomeDaemon() ΠΈΠ· ΡΠ°Π·Π΄Π΅Π»Π° 37.2;
-
ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΠΉ, ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-Π΄ΠΎΠΌΠ΅Π½Π°, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 55.12;
-
Π΅ΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ ΠΎΡΠ²Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΡΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΆΡΡΠ½Π°Π», ΠΏΡΠΈΠΌΠ΅Π½ΡΡ Π²ΡΠ·ΠΎΠ² syslog().
Π ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΡ Π±Ρ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π²Π²Π΅Π»ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°ΡΡΠΎΡΡ Π·Π°ΠΏΠΈΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ syslog(). ΠΡΠΎ ΠΈΡΠΊΠ»ΡΡΠΈΠ»ΠΎ Π±Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΆΡΡΠ½Π°Π»Π° Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊΠΎΠΌ. Π ΡΠΎΠΌΡ ΠΆΠ΅ Π½Π΅ ΡΡΠΎΠΈΡ Π·Π°Π±ΡΠ²Π°ΡΡ, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΠ·ΠΎΠ² syslog() Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π·Π°ΡΡΠ°ΡΠ½ΡΠΉ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ fsync().
ΠΠΈΡΡΠΈΠ½Π³ 56.2. ΠΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ UDP-ΡΠ»ΡΠΆΠ±Ρ echo
_________________________________________________________________sockets/id_echo_sv.c
#include <syslog.h>
#include "id_echo.h"
#include "become_daemon.h"
int
main(int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];
if (becomeDaemon(0) == -1)
errExit("becomeDaemon");
sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
if (sfd == -1) {
syslog(LOG_ERR, "Could not create server socket (%s)",
strerror(errno));
exit(EXIT_FAILURE);
/* ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»ΡΠΌ ΠΈΡ
ΠΊΠΎΠΏΠΈΠΈ */
}
for (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);
if (numRead == -1)
errExit("recvfrom");
if (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "Error echoing response to %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________sockets/id_echo_sv.c
ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 56.3. Π Π½Π΅ΠΉ ΡΠΎΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-Π΄ΠΎΠΌΠ΅Π½Π°, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½Π°Ρ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 55.12. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΈΠΌΡ ΡΠ΅ΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ·Π»Π°, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ. ΠΠ»ΠΈΠ΅Π½Ρ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΈΠΊΠ», Π³Π΄Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΎΡΡΠ°Π²ΡΠΈΡ ΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌ, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΠΎΡΠ²Π΅Ρ.
ΠΠΈΡΡΠΈΠ½Π³ 56.3. ΠΠ»ΠΈΠ΅Π½Ρ Π΄Π»Ρ UDP-ΡΠ»ΡΠΆΠ±Ρ echo
#include "id_echo.h"
int
main(int argc, char *argv[])
{
int sfd, j;
size_t len;
ssize_t numRead;
char buf[BUF_SIZE];
if (argc < 2 || strcmp(argv[1], "—help") == 0)
usageErr("%s host msg…n", argv[0]);
/* Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
if (sfd == -1)
fatal("Could not connect to server socket");
/* ΠΠΎΡΡΠ»Π°Π΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌ */
for (j = 2; j < argc; j++) {
len = strlen(argv[j]);
if (write(sfd, argv[j], len) != len)
fatal("partial/failed write");
numRead = read(sfd, buf, BUF_SIZE);
if (numRead == -1)
errExit("read");
printf("[%ld bytes] %.*sn", (long) numRead, (int) numRead, buf);
}
exit(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c
ΠΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΈ Π΄Π²ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½ΡΠ°:
$ su // ΠΠ»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΊ Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΠΏΠΎΡΡΡ Π½ΡΠΆΠ½Ρ ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ
Password:
# ./id_echo_sv // Π‘Π΅ΡΠ²Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π² ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
# exit // ΠΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΠΎΡ ΠΏΡΠ°Π² Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°
$ ./id_echo_cl localhost hello world // ΠΡΠΎΡ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π²Π΅ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌΡ
[5 bytes] hello // ΠΠ»ΠΈΠ΅Π½Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΎΡΠ²Π΅Ρ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°
[5 bytes] world
$ ./id_echo_cl localhost goodbye // ΠΡΠΎΡ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ»Π΅Ρ ΠΎΠ΄Π½Ρ Π΄Π°ΡΠ°Π³ΡΠ°ΠΌΠΌΡ
[7 bytes] goodbye
ΠΠ΅Π»Π°Ρ ΠΏΡΠΈΡΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ)
ΠΡΡΠΎΡΠ½ΠΈΠΊ: linux.org.ru