"Linux API" рдмреБрдХ рдХрд░рд╛. рд╕рд░реНрд╡рд╕рдорд╛рд╡реЗрд╢рдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ"


"Linux API" рдмреБрдХ рдХрд░рд╛. рд╕рд░реНрд╡рд╕рдорд╛рд╡реЗрд╢рдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ"

рд╢реБрдн рджреБрдкрд╛рд░ рдореА "Linux API" рд╣реЗ рдкреБрд╕реНрддрдХ рддреБрдордЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдЖрдгреВрди рджреЗрддреЛ. рдПрдХ рд╕рд░реНрд╡рд╕рдорд╛рд╡реЗрд╢рдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ" (рдкреБрд╕реНрддрдХрд╛рдЪреЗ рднрд╛рд╖рд╛рдВрддрд░ рд▓рд┐рдирдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕). рдкреНрд░рдХрд╛рд╢рдХрд╛рдЪреНрдпрд╛ рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░ рдЖрдгрд┐ рддреБрдореНрд╣реА рдкреНрд░рдЪрд╛рд░рд╛рддреНрдордХ рдХреЛрдб рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛рд╕ рддреЗ рдСрд░реНрдбрд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ LinuxAPI , рддреБрдореНрд╣рд╛рд▓рд╛ 30% рд╕реВрдЯ рдорд┐рд│реЗрд▓.

рд╕рдВрджрд░реНрднрд╛рд╕рд╛рдареА рдкреБрд╕реНрддрдХрд╛рддреАрд▓ рдЙрддрд╛рд░рд╛:

рд╕реЙрдХреЗрдЯреНрд╕: рд╕рд░реНрд╡реНрд╣рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЖрдореНрд╣реА рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдЖрдгрд┐ рд╕рдорд╛рдВрддрд░ рд╕рд░реНрд╡реНрд╣рд░ рдбрд┐рдЭрд╛рдЗрди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдореВрд▓рднреВрдд рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░реВ, рдЖрдгрд┐ inetd рдирд╛рд╡рд╛рдЪрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбрд┐рдорди рджреЗрдЦреАрд▓ рдкрд╛рд╣реВ, рдЬреНрдпрд╛рдореБрд│реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕рд░реНрд╡реНрд╣рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрдпрд╛рд░ рдХрд░рдгреЗ рд╕реЛрдкреЗ рд╣реЛрддреЗ.

рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдЖрдгрд┐ рд╕рдорд╛рдВрддрд░ рд╕рд░реНрд╡реНрд╣рд░

рджреЛрди рд╕рд╛рдорд╛рдиреНрдп рд╕реЙрдХреЗрдЯ-рдЖрдзрд╛рд░рд┐рдд рдиреЗрдЯрд╡рд░реНрдХ рд╕рд░реНрд╡реНрд╣рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдЖрд╣реЗрдд:

  • рдкреБрдирд░рд╛рд╡реГрддреНрддреА: рд╕рд░реНрд╡реНрд╣рд░ рдХреНрд▓рд╛рдпрдВрдЯрд▓рд╛ рдПрдХрд╛ рд╡реЗрд│реА рдПрдХ рд╕реЗрд╡рд╛ рджреЗрддреЛ, рдкреНрд░рдердо рдПрдХрд╛ рдХреНрд▓рд╛рдпрдВрдЯрдХрдбреВрди рд╡рд┐рдирдВрддреА (рдХрд┐рдВрд╡рд╛ рдЕрдиреЗрдХ рд╡рд┐рдирдВрддреНрдпрд╛) рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЛ рдЖрдгрд┐ рдирдВрддрд░ рдкреБрдвреАрд▓рдХрдбреЗ рдЬрд╛рддреЛ;

  • рд╕рдорд╛рдВрддрд░: рд╕рд░реНрд╡реНрд╣рд░ рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдЧреНрд░рд╛рд╣рдХрд╛рдВрдирд╛ рд╕реЗрд╡рд╛ рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗрд▓реЗ рдЖрд╣реЗ.

FIFO рд░рд╛рдВрдЧрд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╕рд░реНрд╡реНрд╣рд░рдЪреЗ рдЙрджрд╛рд╣рд░рдг рдЖрдзреАрдкрд╛рд╕реВрди рд╡рд┐рднрд╛рдЧ 44.8 рдордзреНрдпреЗ рд╕рд╛рджрд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ.

рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╕рд░реНрд╡реНрд╣рд░ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХреЗрд╡рд│ рдЕрд╢рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрддрдЪ рдпреЛрдЧреНрдп рдЕрд╕рддрд╛рдд рдЬреЗрдереЗ рдХреНрд▓рд╛рдпрдВрдЯрдЪреНрдпрд╛ рд╡рд┐рдирдВрддреНрдпрд╛рдВрд╡рд░ рдмрд▒реНрдпрд╛рдкреИрдХреА рдЬрд▓рдж рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ, рдХрд╛рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд╛рдпрдВрдЯрд▓рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд╕рдореЛрд░реАрд▓ рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХреНрд▓рд╛рдпрдВрдЯрд▓рд╛ рд╕реЗрд╡рд╛ рдорд┐рд│реЗрдкрд░реНрдпрдВрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдгреНрдпрд╛рд╕ рднрд╛рдЧ рдкрд╛рдбрд▓реЗ рдЬрд╛рддреЗ. рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рдордзреАрд▓ рдПрдХрд▓ рд╡рд┐рдирдВрддреНрдпрд╛ рдЖрдгрд┐ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдВрдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рд╕рд╛рдареА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдкрд░ рдкреНрд░рдХрд░рдг рдЖрд╣реЗ.

рд╕рдорд╛рдВрддрд░ рд╕рд░реНрд╡реНрд╣рд░ рдЕрд╢рд╛ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗрдд рдЬрд┐рдереЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдирдВрддреАрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдмрд░рд╛рдЪ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ рдХрд┐рдВрд╡рд╛ рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░ рджреАрд░реНрдШ рд╕рдВрджреЗрд╢ рдПрдХреНрд╕рдЪреЗрдВрдЬрдордзреНрдпреЗ рд╡реНрдпрд╕реНрдд рдЕрд╕рддрд╛рдд. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдЖрдореНрд╣реА рдкреНрд░рд╛рдореБрдЦреНрдпрд╛рдиреЗ рд╕рдорд╛рдВрддрд░ рд╕рд░реНрд╡реНрд╣рд░ рдбрд┐рдЭрд╛рдЗрди рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ (рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреНрдпрд╛) рдкрджреНрдзрддреАрд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВ, рдЬреЗ рдкреНрд░рддреНрдпреЗрдХ рдирд╡реАрди рдХреНрд▓рд╛рдпрдВрдЯрд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╣реЗ. рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреНрд▓рд╛рдпрдВрдЯрд▓рд╛ рд╕реЗрд╡рд╛ рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡ рдХрд╛рд░реНрдп рдХрд░рддреЗ рдЖрдгрд┐ рдирдВрддрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ. рдпрд╛рддреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ рдЪрд╛рд▓рдд рдЕрд╕рд▓реНрдпрд╛рдореБрд│реЗ, рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдЧреНрд░рд╛рд╣рдХрд╛рдВрдирд╛ рд╕реЗрд╡рд╛ рджреЗрдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ. рдореБрдЦреНрдп рд╕рд░реНрд╡реНрд╣рд░ рдкреНрд░рдХреНрд░рд┐рдпреЗрдЪреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп (рдкрд╛рд▓рдХ) рдкреНрд░рддреНрдпреЗрдХ рдирд╡реАрди рдХреНрд▓рд╛рдпрдВрдЯрд╕рд╛рдареА рд╕реНрд╡рддрдВрддреНрд░ рдореВрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╣реЗ (рдкрд░реНрдпрд╛рдпрдпрд╛рдиреЗ, рдкреНрд░рдХреНрд░рд┐рдпрд╛рдВрдРрд╡рдЬреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рдзрд╛рдЧреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд).

рдкреБрдвреАрд▓ рд╡рд┐рднрд╛рдЧрд╛рдВрдордзреНрдпреЗ, рдЖрдореНрд╣реА рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдЖрдгрд┐ рд╕рдорд╛рдВрддрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдбреЛрдореЗрди рд╕реЙрдХреЗрдЯ рд╕рд░реНрд╡реНрд╣рд░рдЪреА рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣реВ. рд╣реЗ рджреЛрди рд╕рд░реНрд╡реНрд╣рд░ рдЗрдХреЛ рд╕реЗрд╡реЗрдЪреА (RFC 862) рд╕рд░рд▓реАрдХреГрдд рдЖрд╡реГрддреНрддреА рд▓рд╛рдЧреВ рдХрд░рддрд╛рдд, рдЬреА рдХреНрд▓рд╛рдпрдВрдЯрджреНрд╡рд╛рд░реЗ рдкрд╛рдард╡рд▓реЗрд▓реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рдВрджреЗрд╢рд╛рдЪреА рдкреНрд░рдд рдкрд░рдд рдХрд░рддреЗ.

рдкреБрдирд░рд╛рд╡реГрддреНрддреА UDP рд╕рд░реНрд╡реНрд╣рд░ рдкреНрд░рддрд┐рдзреНрд╡рдиреА

рдпрд╛ рдЖрдгрд┐ рдкреБрдвреАрд▓ рднрд╛рдЧрд╛рдд рдЖрдкрдг рдЗрдХреЛ рд╕реЗрд╡реЗрд╕рд╛рдареА рд╕рд░реНрд╡реНрд╣рд░рдЪреА рдУрд│рдЦ рдХрд░реВрди рджреЗрдК. рд╣реЗ рдкреЛрд░реНрдЯ рдХреНрд░рдорд╛рдВрдХ 7 рд╡рд░ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ рдЖрдгрд┐ UDP рдЖрдгрд┐ TCP рджреЛрдиреНрд╣реАрд╡рд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ (рд╣реЗ рдкреЛрд░реНрдЯ рдЖрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ, рдЖрдгрд┐ рдореНрд╣рдгреВрди рдЗрдХреЛ рд╕рд░реНрд╡реНрд╣рд░ рдкреНрд░рд╢рд╛рд╕рдХ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░рд╛рдВрд╕рд╣ рдЪрд╛рд▓рд╡рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ).

рдЗрдХреЛ UDP рд╕рд░реНрд╡реНрд╣рд░ рд╕рддрдд рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рдкреНрд░реЗрд╖рдХрд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рддреА рдкрд░рдд рдХрд░рддреЛ. рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдПрдХрд╛ рд╡реЗрд│реА рдлрдХреНрдд рдПрдХрд╛ рд╕рдВрджреЗрд╢рд╛рд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рдиреЗ, рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреБрд░реЗрд╕реЗ рдЕрд╕реЗрд▓. рд╕рд░реНрд╡реНрд╣рд░рд╕рд╛рдареА рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╛рдЗрд▓ рд╕реВрдЪреА 56.1 рдордзреНрдпреЗ рджрд░реНрд╢рд╡рд┐рд▓реА рдЖрд╣реЗ.

рд╕реВрдЪреА 56.1. id_echo_sv.c рдЖрдгрд┐ id_echo_cl.c рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рд╕рд╛рдареА рд╢реАрд░реНрд╖рд▓реЗрдЦ рдлрд╛рдЗрд▓

#include "inet_sockets.h" /* рдЖрдордЪреА рд╕реЙрдХреЗрдЯ рдлрдВрдХреНрд╢рдиреНрд╕ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ */
# "tlpi_hdr.h" рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рд╛

#SERVICE "echo" рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рд╛ /* UDP рд╕реЗрд╡рд╛ рдирд╛рд╡ */

#define BUF_SIZE 500 /* рдбреЗрдЯрд╛рдЧреНрд░рд╛рдордЪрд╛ рдХрдорд╛рд▓ рдЖрдХрд╛рд░
рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рджреНрд╡рд╛рд░реЗ рд╡рд╛рдЪрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ */
_____________________________________________________________________ sockets/id_echo.h

56.2 рд╕реВрдЪреА рд╕рд░реНрд╡реНрд╣рд░ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рджрд░реНрд╢рд╡рддреЗ. рдЦрд╛рд▓реАрд▓ рдореБрджреНрджреЗ рд▓рдХреНрд╖рд╛рдд рдШреЗрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗрдд:

  • рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдбрд┐рдорди рдореЛрдбрдордзреНрдпреЗ рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рд╕реЗрдХреНрд╢рди 37.2 рдордзреАрд▓ becomeDaemon() рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░рддреЛ;

  • рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдХрд▓рдо 55.12 рдордзреНрдпреЗ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдбреЛрдореЗрди рд╕реЙрдХреЗрдЯрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд╛рдкрд░рддреЛ;

  • рд╕рд░реНрд╡реНрд╣рд░ рдХреНрд▓рд╛рдпрдВрдЯрд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджреЗрдК рд╢рдХрдд рдирд╕рд▓реНрдпрд╛рд╕, рддреЛ syslog() рдХреЙрд▓ рд╡рд╛рдкрд░реВрди рд▓реЙрдЧрд╡рд░ рд╕рдВрджреЗрд╢ рд▓рд┐рд╣рд┐рддреЛ.

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдд, рдЖрдореНрд╣реА syslog() рд╡рд╛рдкрд░реВрди рд▓реЙрдЧрд┐рдВрдЧ рд╕рдВрджреЗрд╢рд╛рдВрдЪреНрдпрд╛ рд╡рд╛рд░рдВрд╡рд╛рд░рддреЗрд╡рд░ рдХрд╛рд╣реА рдорд░реНрдпрд╛рджрд╛ рдШрд╛рд▓реВ рд╢рдХрддреЛ. рд╣реЗ рдЖрдХреНрд░рдордгрдХрд░реНрддреНрдпрд╛рдиреЗ рд╕рд┐рд╕реНрдЯрдо рд▓реЙрдЧ рдУрд╡реНрд╣рд░рдлреНрд▓реЛ рд╣реЛрдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рджреВрд░ рдХрд░реЗрд▓. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╣реЗ рд╡рд┐рд╕рд░реВ рдирдХрд╛ рдХреА syslog() рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдЦреВрдк рдорд╣рд╛рдЧ рдЕрд╕рддреЛ, рдХрд╛рд░рдг рддреЗ fsync() рдореБрд▓рднреВрддрд░рд┐рддреНрдпрд╛ рд╡рд╛рдкрд░рддреЗ.

рд╕реВрдЪреА 56.2. рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╕рд░реНрд╡реНрд╣рд░ рдЬреЛ UDP рдЗрдХреЛ рд╕реЗрд╡рд╛ рд▓рд╛рдЧреВ рдХрд░рддреЛ

_____________________________________________________________________ sockets/id_echo_sv.c
#рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рд╛
# "id_echo.h" рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рд╛
# "become_daemon.h" рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рд╛

int
рдореБрдЦреНрдп (int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
рдЪрд╛рд░ рдмрдл[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

рдЬрд░ (рдбреЗрдорди рдмрдирд▓рд╛ (0) == -1)
errExit("becomeDaemon");

sfd = inetBind(рд╕реЗрд╡рд╛, SOCK_DGRAM, NULL);
рдЬрд░ (sfd == -1) {
syslog(LOG_ERR, "рд╕рд░реНрд╡реНрд╣рд░ рд╕реЙрдХреЗрдЯ рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрд▓реЛ рдирд╛рд╣реА (%s)",
рд╕реНрдЯреНрд░рд░рд░(рддреНрд░реБрдЯреА));
рдирд┐рд░реНрдЧрдорди(EXIT_FAILURE);

/* рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рд╛ рдЖрдгрд┐ рдкреНрд░реЗрд╖рдХрд╛рдВрдирд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдкреНрд░рддреА рдкрд░рдд рдХрд░рд╛ */
}
рдЪреНрдпрд╛ рд╕рд╛рдареА (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

рдЬрд░ (рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдЪрди == -1)
errExit("recvfrom");
рдЬрд░ (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "%s (%s) рд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рдкреНрд░рддрд┐рдзреНрд╡рдиреА рдХрд░рддрд╛рдирд╛ рддреНрд░реБрдЯреА",
inetAddressStr((рд░рдЪрдирд╛ sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
рд╕реНрдЯреНрд░рд░рд░(рддреНрд░реБрдЯреА));
}
}
_____________________________________________________________________ sockets/id_echo_sv.c

рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рд╕реВрдЪреА 56.3 рдордзреАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд╛рдкрд░рддреЛ. рд╣реЗ рд╡рд┐рднрд╛рдЧ 55.12 рдордзреНрдпреЗ рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдбреЛрдореЗрди рд╕реЙрдХреЗрдЯрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд╛рдпрдмреНрд░рд░реАрдЪрд╛ рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░ рдХрд░рддреЗ. рдкреНрд░рдердо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдпреБрдХреНрддрд┐рд╡рд╛рдж рдореНрд╣рдгреВрди, рдХреНрд▓рд╛рдпрдВрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдиреЗрдЯрд╡рд░реНрдХ рдиреЛрдбрдЪреЗ рдирд╛рд╡ рдШреЗрддреЛ рдЬреНрдпрд╛рд╡рд░ рд╕рд░реНрд╡реНрд╣рд░ рд╕реНрдерд┐рдд рдЖрд╣реЗ. рдХреНрд▓рд╛рдпрдВрдЯ рд▓реВрдкрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЛ рдЬрд┐рдереЗ рддреЛ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрд░реНрд╡рд░рд┐рдд рдпреБрдХреНрддрд┐рд╡рд╛рдж рд╕реНрд╡рддрдВрддреНрд░ рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдореНрд╣рдгреВрди рдкрд╛рдард╡рддреЛ рдЖрдгрд┐ рдирдВрддрд░ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдд рд╕рд░реНрд╡реНрд╣рд░рдХрдбреВрди рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рдореБрджреНрд░рд┐рдд рдХрд░рддреЛ.

рд╕реВрдЪреА 56.3. UDP рдЗрдХреЛ рд╕реЗрд╡реЗрд╕рд╛рдареА рдХреНрд▓рд╛рдпрдВрдЯ

# "id_echo.h" рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рд╛

int
рдореБрдЦреНрдп (int argc, char *argv[])
{
int sfd, j;
рдЖрдХрд╛рд░_рдЯреА рд▓реЗрди;
ssize_t numRead;
рдЪрд╛рд░ рдмрдл[BUF_SIZE];

рдЬрд░ (argc < 2 || strcmp(argv[1], "--help") == 0)
usageErr("%s рд╣реЛрд╕реНрдЯ msgтАжn", argv[0]);

/* рдкрд╣рд┐рд▓реНрдпрд╛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдпреБрдХреНрддрд┐рд╡рд╛рджрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд╕рд░реНрд╡реНрд╣рд░ рдкрддреНрддрд╛ рддрдпрд╛рд░ рдХрд░рд╛ */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
рдЬрд░ (sfd == -1)
рдШрд╛рддрдХ ("рд╕рд░реНрд╡реНрд╣рд░ рд╕реЙрдХреЗрдЯрд╢реА рдХрдиреЗрдХреНрдЯ рд╣реЛрдК рд╢рдХрд▓реЗ рдирд╛рд╣реА");

/* рдЙрд░реНрд╡рд░рд┐рдд рд╡рд┐рддрд░реНрдХ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдбреЗрдЯрд╛рдЧреНрд░рд╛рдордЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдкрд╛рдард╡рд╛ */
рд╕рд╛рдареА (j = 2; j < argc; j++) {
len = strlen(argv[j]);
рдЬрд░ (рд▓рд┐рд╣рд╛(sfd, argv[j], len) != len)
рдШрд╛рддрдХ ("рдЖрдВрд╢рд┐рдХ/рдЕрдпрд╢рд╕реНрд╡реА рд▓реЗрдЦрди");

numRead = рд╡рд╛рдЪрд╛(sfd, buf, BUF_SIZE);
рдЬрд░ (рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдЪрди == -1)
errExit("рд╡рд╛рдЪрдгреЗ");
printf("[%ld bytes] %.*sn", (рд▓рд╛рдВрдм) numRead, (int) numRead, buf);
}
рдирд┐рд░реНрдЧрдорди(EXIT_SUCCESS);
}
_____________________________________________________________________ sockets/id_echo_cl.c

рдЦрд╛рд▓реА рд╕рд░реНрд╡реНрд╣рд░ рдЪрд╛рд▓рд╡рддрд╛рдирд╛ рдЖрдореНрд╣реА рдХрд╛рдп рдкрд╛рд╣реВ рдЖрдгрд┐ рджреЛрди рдХреНрд▓рд╛рдпрдВрдЯ рдЙрджрд╛рд╣рд░рдгреЗ рдкрд╛рд╣реВ:

$su // рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдЖрд░рдХреНрд╖рд┐рдд рдкреЛрд░реНрдЯрд╢реА рдмрд╛рдВрдзрдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд
рдкрд╛рд╕рд╡рд░реНрдб:
# ./id_echo_sv // рд╕рд░реНрд╡реНрд╣рд░ рдкрд╛рд░реНрд╢реНрд╡рднреВрдореА рдореЛрдбрдордзреНрдпреЗ рдЬрд╛рддреЛ
# рдирд┐рд░реНрдЧрдорди // рдкреНрд░рд╢рд╛рд╕рдХ рдЕрдзрд┐рдХрд╛рд░ рд╕реЛрдбреВрди рджреНрдпрд╛
$ ./id_echo_cl localhost hello world // рд╣рд╛ рдХреНрд▓рд╛рдпрдВрдЯ рджреЛрди рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдкрд╛рдард╡рддреЛ
[рел рдмрд╛рдЗрдЯреНрд╕] рд╣реЕрд▓реЛ // рдХреНрд▓рд╛рдпрдВрдЯ рд╕рд░реНрд╡реНрд╣рд░рдХрдбреВрди рдорд┐рд│рд╛рд▓реЗрд▓рд╛ рдкреНрд░рддрд┐рд╕рд╛рдж рджрд╛рдЦрд╡рддреЛ
[рел рдмрд╛рдЗрдЯреНрд╕] рдЬрдЧ
$ ./id_echo_cl рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдЧреБрдбрдмрд╛рдп // рд╣рд╛ рдХреНрд▓рд╛рдпрдВрдЯ рдПрдХ рдбреЗрдЯрд╛рдЧреНрд░рд╛рдо рдкрд╛рдард╡рддреЛ
[рен рдмрд╛рдЗрдЯреНрд╕] рдирд┐рд░реЛрдк

рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдирдВрджрджрд╛рдпреА рд╡рд╛рдЪрдирд╛рдЪреА рдЗрдЪреНрдЫрд╛ рдХрд░рддреЛ)

рд╕реНрддреНрд░реЛрдд: linux.org.ru