เบ›เบทเป‰เบก โ€œLinux API. เบ„เบนเปˆเบกเบทเบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบš"


เบ›เบทเป‰เบก โ€œLinux API. เบ„เบนเปˆเบกเบทเบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบš"

เบชเบฐโ€‹เบšเบฒเบโ€‹เบ”เบตโ€‹เบ•เบญเบ™โ€‹เบชเบงเบฒเบ เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ›เบทเป‰เบก "Linux API. เบ„เบนเปˆโ€‹เบกเบทโ€‹เบ—เบตเปˆโ€‹เบชเบปเบกโ€‹เบšเบนเบ™โ€‹เปเบšเบšโ€ (เบเบฒเบ™โ€‹เปเบ›โ€‹เบžเบฒโ€‹เบชเบฒโ€‹เบ‚เบญเบ‡โ€‹เบ›เบถเป‰เบก เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก Linux). เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบชเบฑเปˆเบ‡เป„เบ”เป‰เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบœเบนเป‰เป€เบœเบตเบเปเบœเปˆ, เปเบฅเบฐเบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบชเบปเปˆเบ‡เป€เบชเบตเบกเบเบฒเบ™เบ‚เบฒเบ LinuxAPI , เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบชเปˆเบงเบ™เบซเบผเบธเบ” 30%.

เบ„เบฑเบ”โ€‹เบซเบเปเป‰โ€‹เบˆเบฒเบโ€‹เบ›เบถเป‰เบกโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบญเป‰เบฒเบ‡โ€‹เบญเบตเบ‡โ€‹:

เป€เบ•เบปเป‰เบฒเบฎเบฑเบš: เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ

เปƒเบ™เบšเบปเบ”เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบญเบญเบเปเบšเบšเป€เบŠเบตเบŸเป€เบงเบตเปเบšเบšเบŠเปเป‰เบฒเป† เปเบฅเบฐเบ‚เบฐเปœเบฒเบ™, เปเบฅเบฐเบเบฑเบ‡เป€เบšเบดเปˆเบ‡ daemon เบžเบดเป€เบชเบ”เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ inetd, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบŠเบตเบŸเป€เบงเบตเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”.

เป€เบŠเบตเบšเป€เบงเบตเปเบšเบšเบŠเป‰เบณเป† เปเบฅเบฐเบ‚เบฐเปœเบฒเบ™

เบกเบตเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเบณเป€เบŠเบตเบšเป€เบงเบตเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆเป€เบ•เบปเป‰เบฒเบฎเบฑเบšเบ—เบปเปˆเบงเป„เบ›เบชเบญเบ‡เบญเบฑเบ™:

  • iterative: เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบฅเบนเบเบ„เป‰เบฒเบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡, เบ—เปเบฒเบญเบดเบ”เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป (เบซเบผเบทเบซเบผเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป) เบˆเบฒเบเบฅเบนเบเบ„เป‰เบฒเบซเบ™เบถเปˆเบ‡เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเป‰เบฒเบเป„เบ›เบ•เปเปˆเป„เบ›;

  • เบ‚เบฐเบซเบ™เบฒเบ™: เป€เบŠเบตเบšเป€เบงเบตเบ–เบทเบเบญเบญเบเปเบšเบšเป€เบžเบทเปˆเบญเบฎเบฑเบšเปƒเบŠเป‰เบฅเบนเบเบ„เป‰เบฒเบซเบผเบฒเบเป†เบ„เบปเบ™เบžเป‰เบญเบกเป†เบเบฑเบ™.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเบ—เบตเปˆเบŠเปเป‰เบฒเบเบฑเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เบดเบง FIFO เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปเบฅเป‰เบงเปƒเบ™เบžเบฒเบ 44.8.

เป€เบŠเบตเบšเป€เบงเบตเปเบšเบšเบŠเป‰เบณเป†เบกเบฑเบเบˆเบฐเป€เปเบฒเบฐเบชเบปเบกเบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป„เบ”เป‰เป„เบงเบžเปเบชเบปเบกเบ„เบงเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบ–เบทเบเบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เบฅเปเบ–เป‰เบฒเบˆเบปเบ™เบเปˆเบงเบฒเบฅเบนเบเบ„เป‰เบฒเบญเบทเปˆเบ™เบขเบนเปˆเบ—เบฒเบ‡เปœเป‰เบฒเบ‚เบญเบ‡เบกเบฑเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™. เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเปƒเบŠเป‰เบ—เบปเปˆเบงเป„เบ›เบชเปเบฒเบฅเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบฝเบงเปเบฅเบฐเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ.

เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบฐเบซเบ™เบฒเบ™เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปเบ•เปˆเบฅเบฐเบ„เบฑเป‰เบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡, เบซเบผเบทเบšเปˆเบญเบ™เบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเปƒเบ™เบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบเบฒเบง. เปƒเบ™เบšเบปเบ”เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบธเบกเปƒเบชเปˆเบงเบดเบ—เบตเบเบฒเบ™เปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบก (เปเบฅเบฐเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”) เปƒเบ™เบเบฒเบ™เบญเบญเบเปเบšเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบฐเบซเบ™เบฒเบ™, เป€เบŠเบดเปˆเบ‡เปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบฅเบนเบเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบฅเบนเบเบ„เป‰เบฒเปƒเบซเบกเปˆเปเบ•เปˆเบฅเบฐเบ„เบปเบ™. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ™เบตเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบžเบทเปˆเบญเบฎเบฑเบšเปƒเบŠเป‰เบฅเบนเบเบ„เป‰เบฒเปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเปเบ•เปˆเบฅเบฐเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฒเบ”, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบฅเบนเบเบ„เป‰เบฒเบซเบผเบฒเบเบžเป‰เบญเบกเป†เบเบฑเบ™. เบงเบฝเบเบ‡เบฒเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ•เบปเป‰เบ™เบ•เป (เบžเปเปˆเปเบกเปˆ) เปเบกเปˆเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบฅเบนเบเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบฅเบนเบเบ„เป‰เบฒเปƒเบซเบกเปˆเปเบ•เปˆเบฅเบฐเบ„เบปเบ™ (เบ—เบฒเบ‡เป€เบฅเบทเบญเบ, เบเบฐเบ—เบนเป‰เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™).

เปƒเบ™เบžเบฒเบเบ•เปเปˆเป„เบ›เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เป‚เบ”เป€เบกเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบ—เบตเปˆเบŠเป‰เปเบฒเบเบฑเบ™เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™. เป€เบŠเบตเบšเป€เบงเบตเบชเบญเบ‡เบญเบฑเบ™เบ™เบตเป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ echo เบชเบฐเบšเบฑเบšเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบ (RFC 862), เป€เบŠเบดเปˆเบ‡เบชเบปเปˆเบ‡เบ„เบทเบ™เบชเบณเป€เบ™เบปเบฒเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเบกเบฑเบ™.

เป€เบŠเบตเบšเป€เบงเบต UDP เบŠเป‰เบณเป†เบชเบฝเบ‡เบ”เบฑเบ‡

เปƒเบ™เบ™เบตเป‰เปเบฅเบฐเบžเบฒเบเบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปเบ™เบฐเบ™เปเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ echo. เบกเบฑเบ™เบกเบตเบขเบนเปˆเปƒเบ™เบžเบญเบ”เปเบฒเบเป€เบฅเบ 7 เปเบฅเบฐเป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ—เบฑเบ‡ UDP เปเบฅเบฐ TCP (เบžเบญเบ”เบ™เบตเป‰เบ–เบทเบเบชเบฐเบซเบ‡เบงเบ™เป„เบงเป‰, เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ เป€เบŠเบตเบšเป€เบงเบต echo เบ•เป‰เบญเบ‡เป„เบ”เป‰เปเบฅเปˆเบ™เบ”เป‰เบงเบเบชเบดเบ”เบ—เบดเบ‚เบญเบ‡เบœเบนเป‰เป€เบšเบดเปˆเบ‡เปเบเบ‡เบฅเบฐเบšเบปเบš).

เป€เบŠเบตเบšเป€เบงเบต echo UDP เบชเบทเบšเบ•เปเปˆเบญเปˆเบฒเบ™ datagrams เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบชเปเบฒเป€เบ™เบปเบฒเบ‚เบญเบ‡เบกเบฑเบ™เป„เบ›เบซเบฒเบœเบนเป‰เบชเบปเปˆเบ‡. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเป€เบŠเบตเบšเป€เบงเบตเบ•เป‰เบญเบ‡เบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบ—เบทเปˆเบญเบฅเบฐเบญเบฑเบ™, เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเบณเปเบšเบšเบŠเป‰เบณเป†เบˆเบฐเบžเบฝเบ‡เบžเป. เป„เบŸเบฅเปŒเบชเปˆเบงเบ™เบซเบปเบงเบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเปเบกเปˆเบ™เบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เบฅเบฒเบเบเบฒเบ™ 56.1.

เบฅเบฒเบเบเบฒเบ™ 56.1. เป„เบŸเบฅเปŒเบชเปˆเบงเบ™เบซเบปเบงเบชเบณเบฅเบฑเบšเป‚เบ›เบฃเปเบเบฃเบก id_echo_sv.c เปเบฅเบฐ id_echo_cl.c

#include "inet_sockets.h" /* เบ›เบฐเบเบฒเบ”เบŸเบฑเบ‡เบŠเบฑเบ™เบŠเบฑเบญเบเป€เบเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ */
#เบฅเบงเบกเบ—เบฑเบ‡ "tlpi_hdr.h"

#define SERVICE "echo" /* เบŠเบทเปˆเบšเปเบฅเบดเบเบฒเบ™ UDP */

#define BUF_SIZE 500 /* เบ‚เบฐเปœเบฒเบ”เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡ datagrams เบ™เบฑเป‰เบ™
เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เป‚เบ”เบเบฅเบนเบเบ„เป‰เบฒ เปเบฅเบฐเป€เบŠเบตเบšเป€เบงเบต */
_________________________________________________________________________________ sockets/id_echo.h

เบฅเบฒเบเบŠเบทเปˆ 56.2 เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบˆเบธเบ”เบ•เปเปˆเป„เบ›เบ™เบตเป‰เปเบกเปˆเบ™เบชเบปเบกเบ„เบงเบ™เบ—เบตเปˆเบˆเบฐเบชเบฑเบ‡เป€เบเบ”:

  • เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป‚เบซเบกเบ” daemon, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ becomeDaemon() เบˆเบฒเบเบžเบฒเบ 37.2;

  • เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เป‚เบ„เบ‡เบเบฒเบ™เบกเบตเบ„เบงเบฒเบกเบซเบ™เบฒเปเบซเบ™เป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš sockets เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”, เบžเบฑเบ”เบ—เบฐเบ™เบฒเปƒเบ™เบžเบฒเบ 55.12;

  • เบ–เป‰เบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบ„เบทเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบเบฑเบšเบฅเบนเบเบ„เป‰เบฒ, เบกเบฑเบ™เบˆเบฐเบ‚เบฝเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเป„เบ›เบซเบฒเบšเบฑเบ™เบ—เบถเบเป‚เบ”เบเปƒเบŠเป‰ syslog() call.

เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบญเบฒเบ”เบˆเบฐเบเปเบฒเบ™เบปเบ”เบ‚เบญเบšเป€เบ‚เบ”เบˆเปเบฒเบเบฑเบ”เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบ‚เปเป‰เบ„เบงเบฒเบกเป‚เบ”เบเปƒเบŠเป‰ syslog(). เบ™เบตเป‰เบˆเบฐเบฅเบปเบšเบฅเป‰เบฒเบ‡เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เป‚เบˆเบกเบ•เบต overflowing เบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เบฅเบฐเบšเบปเบš. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบขเปˆเบฒเบฅเบทเบกเบงเปˆเบฒเปเบ•เปˆเบฅเบฐเบเบฒเบ™เป‚เบ—เป„เบ›เบซเบฒ syslog() เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เปเบžเบ‡, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เปƒเบŠเป‰ fsync() เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

เบฅเบฒเบเบเบฒเบ™ 56.2. เป€เบŠเบตเบšเป€เบงเบต Iteration เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ UDP echo

_________________________________________________________________ sockets/id_echo_sv.c
#เบฅเบงเบกเบ—เบฑเบ‡
#เบฅเบงเบกเบ—เบฑเบ‡ "id_echo.h"
#เบฅเบงเบกเบ—เบฑเบ‡ "become_daemon.h"

int
main(int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_t เป€เบฅเบ™;
เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

เบ–เป‰เบฒ (เบเบฒเบเป€เบ›เบฑเบ™Daemon(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
เบ–เป‰เบฒ (sfd == -1) {
syslog(LOG_ERR, "เบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบŠเบฑเบญเบเป€เบเบฑเบ”เป€เบŠเบตเบšเป€เบงเบต (%s)",
strerror(errno));
เบญเบญเบ(EXIT_FAILURE);

/* เบฎเบฑเบš datagrams เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบชเปเบฒเป€เบ™เบปเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปƒเบซเป‰เบเบฑเบšเบœเบนเป‰เบชเบปเปˆเบ‡ */
}
เบชเปเบฒเบฅเบฑเบš (;;) {
len = sizeof(เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (เป‚เบ„เบ‡เบชเป‰เบฒเบ‡ sockaddr *) &claddr, &len);

เบ–เป‰เบฒ (numRead == -1)
errExit("recvfrom");
เบ–เป‰เบฒ (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "เป€เบเบตเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเปœเบญเบ‡เบ•เปเปˆ %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________ sockets/id_echo_sv.c

เป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบต, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เป‚เบ›เบฃเปเบเบฃเบกเบˆเบฒเบเบฅเบฒเบเบเบฒเบ™ 56.3. เบกเบฑเบ™เบเบฑเบ‡เปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป€เบ•เบปเป‰เบฒเบฎเบฑเบšเป‚เบ”เป€เบกเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”, เบžเบฑเบ”เบ—เบฐเบ™เบฒเปƒเบ™เบžเบฒเบ 55.12. เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เปเบ–เบงเบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เปเบฒเบญเบดเบ”, เป‚เบ„เบ‡เบเบฒเบ™เบฅเบนเบเบ„เป‰เบฒเป€เบญเบปเบฒเบŠเบทเปˆเบ‚เบญเบ‡ node เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ•เบฑเป‰เบ‡เบขเบนเปˆ. เบฅเบนเบเบ„เป‰เบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ loop เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบฑเบ™เบชเบปเปˆเบ‡เปเบ•เปˆเบฅเบฐ argument เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบ›เบฑเบ™ datagrams เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบญเปˆเบฒเบ™เปเบฅเบฐเบžเบดเบก datagrams เบ—เบตเปˆเบกเบฑเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡.

เบฅเบฒเบเบเบฒเบ™ 56.3. เบฅเบนเบเบ„เป‰เบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™ UDP echo

#เบฅเบงเบกเบ—เบฑเบ‡ "id_echo.h"

int
main(int argc, char *argv[])
{
int sfd, j;
size_t เป€เบฅเบ™;
ssize_t numRead;
char buf[BUF_SIZE];

เบ–เป‰เบฒ (argc < 2 || strcmp(argv[1], "--help") == 0)
useErr("%s host msgโ€ฆn", argv[0]);

/* เบชเป‰เบฒเบ‡เบ—เบตเปˆเบขเบนเปˆเป€เบŠเบตเบšเป€เบงเบตเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เปเบ–เบงเบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เปเบฒเบญเบดเบ” */
sfd = inetConnect(argv[1], เบšเปเบฅเบดเบเบฒเบ™, SOCK_DGRAM);
เบ–เป‰เบฒ (sfd == -1)
fatal("เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป€เบ•เบปเป‰เบฒเบฎเบฑเบšเป€เบŠเบตเบšเป€เบงเบต");

/* เบชเบปเปˆเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ–เบฝเบ‡เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡ datagrams เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ */
เบชเปเบฒเบฅเบฑเบš (j = 2; j < argc; j++) {
len = strlen(argv[j]);
เบ–เป‰เบฒ (เบ‚เบฝเบ™(sfd, argv[j], len) != len)
fatal("เบ‚เบฝเบ™เบšเบฒเบ‡เบชเปˆเบงเบ™/เบฅเบปเป‰เบกเป€เบซเบฅเบง");

numRead = เบญเปˆเบฒเบ™(sfd, buf, BUF_SIZE);
เบ–เป‰เบฒ (numRead == -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 // เบฅเบนเบเบ„เป‰เบฒเบ™เบตเป‰เบชเบปเปˆเบ‡เบชเบญเบ‡ datagrams
[5 bytes] เบชเบฐเบšเบฒเบเบ”เบต // เบฅเบนเบเบ„เป‰เบฒเบชเบฐเปเบ”เบ‡เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ
[5 bytes] เป‚เบฅเบ
$ ./id_echo_cl localhost goodbye // เบฅเบนเบเบ„เป‰เบฒเบ™เบตเป‰เบชเบปเปˆเบ‡เบซเบ™เบถเปˆเบ‡ datagram
[7 bytes] เบชเบฐเบšเบฒเบเบ”เบต

เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ‚เปโ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เบญเปˆเบฒเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบชเบธเบโ€‹)

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: linux.org.ru