Mediastreamer2 VoIP เดŽเดžเตเดšเดฟเตป เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดญเดพเด—เด‚ 9

เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเตฝ เดŽเดจเตเดฑเต†เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดŸเตเดคเตเดคเดคเดพเดฃเต เดธเต†เตป เดšเดพเดจเตฝ.

เดกเตเดฏเตเดชเตเดฒเต†เด•เตเดธเต เด‡เดจเตเดฑเตผเด•เต‹เด‚

Mediastreamer2 VoIP เดŽเดžเตเดšเดฟเตป เดชเดฐเตเดฏเดตเต‡เด•เตเดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดญเดพเด—เด‚ 9

เด…เดตเดธเดพเดจเดคเตเดคเดฟเตฝ เดฒเต‡เด–เดจเด‚ เด’เดฐเต เดกเตเดฏเตเดชเตเดฒเต†เด•เตเดธเต เด‡เดจเตเดฑเตผเด•เต‹เด‚ เดชเตเดฐเด–เตเดฏเดพเดชเดฟเดšเตเดšเต, เด‡เดคเดฟเตฝ เดžเด™เตเด™เตพ เด…เดคเต เด‰เดฃเตเดŸเดพเด•เตเด•เตเด‚.

เดกเดฏเด—เตเดฐเด‚ เดŸเตˆเดฑเตเดฑเดฟเตฝ เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เด•เดพเดฃเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เดณเตเดŸเต† เดคเดพเดดเดคเตเดคเต† เดถเตƒเด‚เด–เดฒ เดถเดฌเตเดฆ เด•เดพเตผเดกเดฟเตฝ เดจเดฟเดจเตเดจเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจ เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดชเดพเดค เดฐเต‚เดชเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต. เด‡เดคเต เดฎเตˆเด•เตเดฐเต‹เดซเต‹เดฃเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดธเดฟเด—เตเดจเตฝ เดธเดพเดฎเตเดชเดฟเดณเตเด•เตพ เดจเตฝเด•เตเดจเตเดจเต. เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ, เด‡เดคเต เดธเต†เด•เตเด•เตปเดกเดฟเตฝ 8000 เดธเดพเดฎเตเดชเดฟเดณเตเด•เตพ เดŽเดจเตเดจ เดจเดฟเดฐเด•เตเด•เดฟเตฝ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต. เดฎเต€เดกเดฟเดฏ เดธเตเดŸเตเดฐเต€เดฎเตผ เด“เดกเดฟเดฏเต‹ เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดกเดพเดฑเตเดฑ เดฌเดฟเดฑเตเดฑเต เดกเต†เดชเตเดคเต 16 เดฌเดฟเดฑเตเดฑเตเด•เดณเดพเดฃเต (เด‡เดคเต เดชเตเดฐเดงเดพเดจเดฎเดฒเตเดฒ; เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเต‡เดฃเดฎเต†เด™เตเด•เดฟเตฝ, เด‰เดฏเตผเดจเตเดจ เดฌเดฟเดฑเตเดฑเต เดกเต†เดชเตเดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดดเตเดคเดพเด‚). เดกเดพเดฑเตเดฑ 160 เดธเดพเดฎเตเดชเดฟเดณเตเด•เดณเตเดŸเต† เดฌเตเดฒเต‹เด•เตเด•เตเด•เดณเดพเดฏเดฟ เดคเดฟเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด…เด™เตเด™เดจเต†, เด“เดฐเต‹ เดฌเตเดฒเต‹เด•เตเด•เดฟเดจเตเด‚ 320 เดฌเตˆเดฑเตเดฑเตเด•เตพ เดตเดฒเดฟเดชเตเดชเดฎเตเดฃเตเดŸเต. เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เด‡เตปเดชเตเดŸเตเดŸเดฟเดฒเต‡เด•เตเด•เต เดžเด™เตเด™เตพ เดกเดพเดฑเตเดฑ เดจเตฝเด•เตเดจเตเดจเต, เด…เดคเต เด“เดซเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, เดกเดพเดฑเตเดฑเดฏเตเด•เตเด•เต "เดธเตเดคเดพเดฐเตเดฏเดฎเดพเดฃเต". เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดธเดฎเดฏเดคเตเดคเต เดฎเตˆเด•เตเดฐเต‹เดซเต‹เดฃเดฟเตฝ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเดŸเตเดคเตเดคเตเดตเต†เด™เตเด•เดฟเตฝ เดžเดพเตป เด‡เดคเต เดšเต‡เตผเดคเตเดคเต - เดŸเต‹เตบ เดธเดฟเด—เตเดจเตฝ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดพเดค "เดทเต‚เดŸเตเดŸเต" เดšเต†เดฏเตเดฏเดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดœเดจเดฑเต‡เดฑเตเดฑเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดฟเดจเต เดถเต‡เดทเด‚, เดธเดฟเด—เตเดจเตฝ เดŽเตปเด•เต‹เดกเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเดจเตเดจเต, เด…เดคเต ยต-เดจเดฟเดฏเดฎเด‚ (G.16 เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต) เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดžเด™เตเด™เดณเตเดŸเต† 711-เดฌเดฟเดฑเตเดฑเต เดธเดพเดฎเตเดชเดฟเดณเตเด•เดณเต† เดŽเดŸเตเดŸเต-เดฌเดฟเดฑเตเดฑเตเด•เดณเดพเด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเต. เดŽเตปเด•เต‹เดกเดฑเดฟเดจเตเดฑเต† เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเดฟเตฝ, เดžเด™เตเด™เตพเด•เตเด•เต เด‡เดคเดฟเดจเด•เด‚ เดชเด•เตเดคเดฟ เดตเดฒเดฟเดชเตเดชเดฎเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดฌเตเดฒเต‹เด•เตเด•เต เด‰เดฃเตเดŸเต. เดชเตŠเดคเตเดตเต‡, เดŸเตเดฐเดพเดซเดฟเด•เต เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เต‡เดฃเตเดŸ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด•เด‚เดชเตเดฐเดทเตป เด•เต‚เดŸเดพเดคเต† เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเดพเตป เด•เดดเดฟเดฏเตเด‚. เดŽเดจเตเดจเดพเตฝ เด‡เดตเดฟเดŸเต† เด’เดฐเต เดŽเตปเด•เต‹เดกเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฃเต, เด•เดพเดฐเดฃเด‚ Wireshark-เดจเต ยต-law เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ a-law เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เด•เด‚เดชเตเดฐเดธเต เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ เดฎเดพเดคเตเดฐเดฎเต‡ RTP เดธเตเดŸเตเดฐเต€เดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เด“เดกเดฟเดฏเต‹ เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเต‚.

เดŽเตปเด•เต‹เดกเดฑเดฟเดจเต เดถเต‡เดทเด‚, เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เดญเดพเดฐเด‚ เด•เตเดฑเดžเตเดž เดฌเตเดฒเต‹เด•เตเด•เตเด•เตพ rtpsend เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตโ€Œเด•เตเด•เตเด‚, เด…เดคเต เด…เดตเดฏเต† เด’เดฐเต RTP เดชเดพเด•เตเด•เดฑเตเดฑเดฟเตฝ เด‡เดŸเตเด•เดฏเตเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฏ เดซเตเดฒเดพเด—เตเด•เตพ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ UDP เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเดฒเต‚เดŸเต† เดชเตเดฐเด•เตเดทเต‡เดชเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดฎเต€เดกเดฟเดฏ เดธเตเดŸเตเดฐเต€เดฎเดฑเดฟเดจเต เดจเตฝเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เดณเตเดŸเต† เดฎเตเด•เดณเดฟเดฒเต† เดถเตƒเด‚เด–เดฒ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเดพเดค เดฐเต‚เดชเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต; เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเต€เดกเดฟเดฏ เดธเตเดŸเตเดฐเต€เดฎเดฑเดฟเดจเต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจ RTP เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ rtprecv เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเตเดฑเต† เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเดฟเตฝ เด…เดต เดกเดพเดฑเตเดฑ เดฌเตเดฒเต‹เด•เตเด•เตเด•เดณเตเดŸเต† เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดฆเตƒเดถเตเดฏเดฎเดพเด•เตเดจเตเดจเต, เด…เดต เด“เดฐเต‹เดจเตเดจเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเดšเตเดš เด’เดฐเต เดชเดพเด•เตเด•เดฑเตเดฑเตเดฎเดพเดฏเดฟ เดฏเต‹เดœเดฟเด•เตเด•เตเดจเตเดจเต. เดฌเตเดฒเต‹เด•เตเด•เดฟเตฝ เดชเต‡เดฒเต‹เดกเต เดกเดพเดฑเตเดฑ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเตเดณเตเดณเต‚; เดฎเตเดฎเตเดชเดคเตเดคเต† เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เด…เดต เดšเดฟเดคเตเดฐเต€เด•เดฐเดฃเดคเตเดคเดฟเตฝ เดชเดšเตเดšเดฏเดฟเตฝ เด•เดพเดฃเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เดฌเตเดฒเต‹เด•เตเด•เตเด•เตพ เดกเต€เด•เต‹เดกเตผ เดซเดฟเตฝเดŸเตเดŸเดฑเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต, เด…เดตเดฏเดฟเตฝ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดธเดฟเด‚เด—เดฟเตพ-เดฌเตˆเดฑเตเดฑเต เดธเดพเดฎเตเดชเดฟเดณเตเด•เดณเต† เดฒเต€เดจเดฟเดฏเตผ, 16-เดฌเดฟเดฑเตเดฑเต เด†เดฏเดฟ เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดฎเต€เดกเดฟเดฏ เดธเตเดŸเตเดฐเต€เดฎเตผ เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ เดตเดดเดฟ เด‡เดคเต เด‡เดคเดฟเดจเด•เด‚ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚. เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เดนเต†เดกเตโ€Œเดธเต†เดฑเตเดฑเดฟเดจเตเดฑเต† เดธเตเดชเต€เด•เตเด•เดฑเตเด•เดณเดฟเตฝ เดชเตเดฒเต‡เดฌเดพเด•เตเด•เดฟเดจเดพเดฏเดฟ เดžเด™เตเด™เตพ เด…เดต เดธเต—เดฃเตเดŸเต เด•เดพเตผเดกเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเต.

เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฒเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เดพเด‚. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เตพ เดฎเตเดฎเตเดชเต เดตเต‡เตผเดคเดฟเดฐเดฟเดšเตเดš เดฑเดฟเดธเต€เดตเตผ, เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดฑเตเดฑเตผ เดซเดฏเดฒเตเด•เตพ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚. เด‡เดคเดฟเดจเตเดฎเตเดฎเตเดชเต, เดชเต‹เตผเดŸเตเดŸเตเด•เตพเด•เตเด•เตเด‚ เดตเดฟเดฒเดพเดธเด™เตเด™เตพเด•เตเด•เตเดฎเดพเดฏเดฟ เดžเด™เตเด™เตพ เดธเตเดฅเดฟเดฐเดฎเดพเดฏ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดฟเดฐเตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ เด‡เดชเตเดชเต‹เตพ เดธเตเดฑเตเดฑเดพเตผเดŸเตเดŸเดชเตเดชเดฟเตฝ เดžเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจ เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเต เด•เดดเดฟเดฏเดฃเด‚. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เดžเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเด‚. เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ เดžเด™เตเด™เตพ เด’เดฐเต เด•เดฃเด•เตเดทเตป เดธเตเดฅเดพเดชเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ เด‡เดจเตเดฑเตผเด•เต‹เดฎเดฟเดจเตเดฑเต† IP เดตเดฟเดฒเดพเดธเดตเตเด‚ เดชเต‹เตผเดŸเตเดŸเตเด‚ เดธเดœเตเดœเดฎเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เด†เดฆเตเดฏเด‚, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดฒเต‡เด•เตเด•เต เด…เดคเดฟเดจเตเดฑเต† เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด˜เดŸเดจ เดšเต‡เตผเด•เตเด•เดพเด‚:

struct _app_vars
{
  int  local_port;              /* ะ›ะพะบะฐะปัŒะฝั‹ะน ะฟะพั€ั‚. */
  int  remote_port;             /* ะŸะพั€ั‚ ะฟะตั€ะตะณะพะฒะพั€ะฝะพะณะพ ัƒัั‚ั€ะพะนัั‚ะฒะฐ ะฝะฐ ัƒะดะฐะปะตะฝะฝะพะผ ะบะพะผะฟัŒัŽั‚ะตั€ะต. */
  char remote_addr[128];        /* IP-ะฐะดั€ะตั ัƒะดะฐะปะตะฝะฝะพะณะพ ะบะพะผะฟัŒัŽั‚ะตั€ะฐ. */
  MSDtmfGenCustomTone dtmf_cfg; /* ะะฐัั‚ั€ะพะนะบะธ ั‚ะตัั‚ะพะฒะพะณะพ ัะธะณะฝะฐะปะฐ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ. */
};

typedef struct _app_vars app_vars;

vars เดŽเดจเตเดจ เดˆ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด’เดฐเต เด˜เดŸเดจ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเด–เตเดฏเดพเดชเดฟเด•เตเด•เตเด‚.
เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดซเด‚เด—เตเดทเตป เดšเต‡เตผเด•เตเด•เดพเด‚:

/* ะคัƒะฝะบั†ะธั ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธั ะฐั€ะณัƒะผะตะฝั‚ะพะฒ ะบะพะผะฐะฝะดะฝะพะน ัั‚ั€ะพะบะธ ะฒ
* ะฝะฐัั‚ั€ะพะนะบะธ ะฟั€ะพะณั€ะฐะผะผั‹. */
void  scan_args(int argc, char *argv[], app_vars *v)
{
    char i;
    for (i=0; i<argc; i++)
    {
        if (!strcmp(argv[i], "--help"))
        {
            char *p=argv[0]; p=p + 2;
            printf("  %s walkie talkienn", p);
            printf("--help      List of options.n");
            printf("--version   Version of application.n");
            printf("--addr      Remote abonent IP address string.n");
            printf("--port      Remote abonent port number.n");
            printf("--lport     Local port number.n");
            printf("--gen       Generator frequency.n");
            exit(0);
        }

        if (!strcmp(argv[i], "--version"))
        {
            printf("0.1n");
            exit(0);
        }

        if (!strcmp(argv[i], "--addr"))
        {
            strncpy(v->remote_addr, argv[i+1], 16);
            v->remote_addr[16]=0;
            printf("remote addr: %sn", v->remote_addr);
        }

        if (!strcmp(argv[i], "--port"))
        {
            v->remote_port=atoi(argv[i+1]);
            printf("remote port: %in", v->remote_port);
        }

        if (!strcmp(argv[i], "--lport"))
        {
            v->local_port=atoi(argv[i+1]);
            printf("local port : %in", v->local_port);
        }

        if (!strcmp(argv[i], "--gen"))
        {
            v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
                printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
        }
    }
}

เดชเดพเดดเตเดธเดฟเด‚เด—เดฟเดจเตเดฑเต† เดซเดฒเดฎเดพเดฏเดฟ, เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ vars เด˜เดŸเดจเดฏเตเดŸเต† เดซเต€เตฝเดกเตเด•เดณเดฟเตฝ เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด‚. เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดธเด‚เดชเตเดฐเต‡เดทเดฃเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเตเดฎเดพเดฏ เดชเดพเดคเด•เตพ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดชเตเดฐเดงเดพเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚; เดŸเดฟเด•เตเด•เตผ เด•เดฃเด•เตเดฑเตเดฑเตเดšเต†เดฏเตโ€Œเดค เดถเต‡เดทเด‚, เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด‚ เด…เดจเดจเตเดคเดฎเดพเดฏ เดฒเต‚เดชเตเดชเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเตเดฑเตเด‚, เด…เดคเต เดœเดจเดฑเต‡เดฑเตเดฑเตผ เด†เดตเตƒเดคเตเดคเดฟ เดชเต‚เดœเตเดฏเดฎเดฒเตเดฒเดพเดคเตเดคเดคเดพเดฏเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดŸเต†เดธเตเดฑเตเดฑเต เดœเดจเดฑเต‡เดฑเตเดฑเตผ เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด‚. เด…เดคเต เดจเดฟเตผเดคเตเดคเดพเดคเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต.

เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดฟเดจเต เด…เดคเดฟเดจเตเดฑเต† เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เด•เดพเดฐเดฃเด‚ เดˆ เดชเตเดจเดฐเดพเดฐเด‚เดญเด™เตเด™เตพ เด†เดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดฐเตเด‚; เดšเดฟเดฒ เด•เดพเดฐเดฃเด™เตเด™เดณเดพเตฝ เด‡เดคเดฟเดจเต 16 เดธเต†เด•เตเด•เตปเดกเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เดฆเตˆเตผเด˜เตเดฏเดฎเตเดณเตเดณ เด’เดฐเต เดธเดฟเด—เตเดจเตฝ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เด…เดคเดฟเดจเตเดฑเต† เดฆเตˆเตผเด˜เตเดฏเด‚ 32-เดฌเดฟเดฑเตเดฑเต เดจเดฎเตเดชเตผ เด•เตŠเดฃเตเดŸเดพเดฃเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต.

เดฎเตเดดเตเดตเตป เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด‚ เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเด‚:

/* ะคะฐะนะป mstest8.c ะ˜ะผะธั‚ะฐั‚ะพั€ ะฟะตั€ะตะณะพะฒะพั€ะฝะพะณะพ ัƒัั‚ั€ะพะนัั‚ะฒะฐ. */

#include <mediastreamer2/mssndcard.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/msrtp.h>

/* ะŸะพะดะบะปัŽั‡ะฐะตะผ ั„ะฐะนะป ะพะฑั‰ะธั… ั„ัƒะฝะบั†ะธะน. */
#include "mstest_common.c"

/*----------------------------------------------------------*/
struct _app_vars
{
    int  local_port;              /* ะ›ะพะบะฐะปัŒะฝั‹ะน ะฟะพั€ั‚. */
    int  remote_port;             /* ะŸะพั€ั‚ ะฟะตั€ะตะณะพะฒะพั€ะฝะพะณะพ ัƒัั‚ั€ะพะนัั‚ะฒะฐ ะฝะฐ ัƒะดะฐะปะตะฝะฝะพะผ ะบะพะผะฟัŒัŽั‚ะตั€ะต. */
    char remote_addr[128];        /* IP-ะฐะดั€ะตั ัƒะดะฐะปะตะฝะฝะพะณะพ ะบะพะผะฟัŒัŽั‚ะตั€ะฐ. */
    MSDtmfGenCustomTone dtmf_cfg; /* ะะฐัั‚ั€ะพะนะบะธ ั‚ะตัั‚ะพะฒะพะณะพ ัะธะณะฝะฐะปะฐ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ. */
};

typedef struct _app_vars app_vars;

/*----------------------------------------------------------*/
/* ะกะพะทะดะฐะตะผ ะดัƒะฟะปะตะบัะฝัƒัŽ RTP-ัะตััะธัŽ. */
RtpSession* create_duplex_rtp_session(app_vars v)
{
    RtpSession *session = create_rtpsession (v.local_port, v.local_port + 1, FALSE, RTP_SESSION_SENDRECV);
    rtp_session_set_remote_addr_and_port(session, v.remote_addr, v.remote_port, v.remote_port + 1);
    rtp_session_set_send_payload_type(session, PCMU);
    return session;
}

/*----------------------------------------------------------*/
/* ะคัƒะฝะบั†ะธั ะฟั€ะตะพะฑั€ะฐะทะพะฒะฐะฝะธั ะฐั€ะณัƒะผะตะฝั‚ะพะฒ ะบะพะผะฐะฝะดะฝะพะน ัั‚ั€ะพะบะธ ะฒ
* ะฝะฐัั‚ั€ะพะนะบะธ ะฟั€ะพะณั€ะฐะผะผั‹. */
void  scan_args(int argc, char *argv[], app_vars *v)
{
    char i;
    for (i=0; i<argc; i++)
    {
        if (!strcmp(argv[i], "--help"))
        {
            char *p=argv[0]; p=p + 2;
            printf("  %s walkie talkienn", p);
            printf("--help      List of options.n");
            printf("--version   Version of application.n");
            printf("--addr      Remote abonent IP address string.n");
            printf("--port      Remote abonent port number.n");
            printf("--lport     Local port number.n");
            printf("--gen       Generator frequency.n");
            exit(0);
        }

        if (!strcmp(argv[i], "--version"))
        {
            printf("0.1n");
            exit(0);
        }

        if (!strcmp(argv[i], "--addr"))
        {
            strncpy(v->remote_addr, argv[i+1], 16);
            v->remote_addr[16]=0;
            printf("remote addr: %sn", v->remote_addr);
        }

        if (!strcmp(argv[i], "--port"))
        {
            v->remote_port=atoi(argv[i+1]);
            printf("remote port: %in", v->remote_port);
        }

        if (!strcmp(argv[i], "--lport"))
        {
            v->local_port=atoi(argv[i+1]);
            printf("local port : %in", v->local_port);
        }

        if (!strcmp(argv[i], "--gen"))
        {
            v -> dtmf_cfg.frequencies[0] = atoi(argv[i+1]);
                printf("gen freq : %in", v -> dtmf_cfg.frequencies[0]);
        }
    }
}

/*----------------------------------------------------------*/
int main(int argc, char *argv[])
{
    /* ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐัั‚ั€ะพะนะบะธ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ. */
    app_vars vars={5004, 7010, "127.0.0.1", {0}};

    /* ะฃัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐัั‚ั€ะพะนะบะธ ะฝะฐัั‚ั€ะพะนะบะธ ะฟั€ะพะณั€ะฐะผะผั‹ ะฒ
     * ัะพะพั‚ะฒะตั‚ัั‚ะฒะธะธ ั ะฐั€ะณัƒะผะตะฝั‚ะฐะผะธ ะบะพะผะฐะฝะดะฝะพะน ัั‚ั€ะพะบะธ. */
    scan_args(argc, argv, &vars);

    ms_init();

    /* ะกะพะทะดะฐะตะผ ัะบะทะตะผะฟะปัั€ั‹ ั„ะธะปัŒั‚ั€ะพะฒ ะฟะตั€ะตะดะฐัŽั‰ะตะณะพ ั‚ั€ะฐะบั‚ะฐ. */
    MSSndCard *snd_card =
        ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter *snd_card_read = ms_snd_card_create_reader(snd_card);
    MSFilter *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
    MSFilter *rtpsend = ms_filter_new(MS_RTP_SEND_ID);

    /* ะกะพะทะดะฐะตะผ ั„ะธะปัŒั‚ั€ ะบะพะดะตั€ะฐ. */
    MSFilter *encoder = ms_filter_create_encoder("PCMU");

    /* ะ ะตะณะธัั‚ั€ะธั€ัƒะตะผ ั‚ะธะฟั‹ ะฝะฐะณั€ัƒะทะบะธ. */
    register_payloads();

    /* ะกะพะทะดะฐะตะผ ะดัƒะฟะปะตะบัะฝัƒัŽ RTP-ัะตััะธัŽ. */
    RtpSession* rtp_session= create_duplex_rtp_session(vars);
    ms_filter_call_method(rtpsend, MS_RTP_SEND_SET_SESSION, rtp_session);

    /* ะกะพะตะดะธะฝัะตะผ ั„ะธะปัŒั‚ั€ั‹ ะฟะตั€ะตะดะฐั‚ั‡ะธะบะฐ. */
    ms_filter_link(snd_card_read, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, encoder, 0);
    ms_filter_link(encoder, 0, rtpsend, 0);

    /* ะกะพะทะดะฐะตะผ ั„ะธะปัŒั‚ั€ั‹ ะฟั€ะธะตะผะฝะพะณะพ ั‚ั€ะฐะบั‚ะฐ. */
    MSFilter *rtprecv = ms_filter_new(MS_RTP_RECV_ID);
    ms_filter_call_method(rtprecv, MS_RTP_RECV_SET_SESSION, rtp_session);

    /* ะกะพะทะดะฐะตะผ ั„ะธะปัŒั‚ั€ ะดะตะบะพะดะตั€ะฐ, */
    MSFilter *decoder=ms_filter_create_decoder("PCMU");

    /* ะกะพะทะดะฐะตะผ ั„ะธะปัŒั‚ั€ ะทะฒัƒะบะพะฒะพะน ะบะฐั€ั‚ั‹. */
    MSFilter *snd_card_write = ms_snd_card_create_writer(snd_card);

    /* ะกะพะตะดะธะฝัะตะผ ั„ะธะปัŒั‚ั€ั‹ ะฟั€ะธั‘ะผะฝะพะณะพ ั‚ั€ะฐะบั‚ะฐ. */
    ms_filter_link(rtprecv, 0, decoder, 0);
    ms_filter_link(decoder, 0,  snd_card_write, 0);

    /* ะกะพะทะดะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ - ั‚ะธะบะตั€. */
    MSTicker *ticker = ms_ticker_new();

    /* ะŸะพะดะบะปัŽั‡ะฐะตะผ ะธัั‚ะพั‡ะฝะธะบ ั‚ะฐะบั‚ะพะฒ. */
    ms_ticker_attach(ticker, snd_card_read);
    ms_ticker_attach(ticker, rtprecv);

    /* ะ•ัะปะธ ะฝะฐัั‚ั€ะพะนะบะฐ ั‡ะฐัั‚ะพั‚ั‹ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ ะพั‚ะปะธั‡ะฝะฐ ะพั‚ ะฝัƒะปั, ั‚ะพ ะทะฐะฟัƒัะบะฐะตะผ ะณะตะฝะตั€ะฐั‚ะพั€. */   
    if (vars.dtmf_cfg.frequencies[0])
    {
        /* ะะฐัั‚ั€ะฐะธะฒะฐะตะผ ัั‚ั€ัƒะบั‚ัƒั€ัƒ, ัƒะฟั€ะฐะฒะปััŽั‰ัƒัŽ ะฒั‹ั…ะพะดะฝั‹ะผ ัะธะณะฝะฐะปะพะผ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ. */
        vars.dtmf_cfg.duration = 10000;
        vars.dtmf_cfg.amplitude = 1.0;
    }

    /* ะžั€ะณะฐะฝะธะทัƒะตะผ ั†ะธะบะป ะฟะตั€ะตะทะฐะฟัƒัะบะฐ ะณะตะฝะตั€ะฐั‚ะพั€ะฐ. */
    while(TRUE)
    {
        if(vars.dtmf_cfg.frequencies[0])
        {
            /* ะ’ะบะปัŽั‡ะฐะตะผ ะทะฒัƒะบะพะฒะพะน ะณะตะฝะตั€ะฐั‚ะพั€. */
            ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY_CUSTOM,
                    (void*)&vars.dtmf_cfg);
        }
        /* ะฃะบะปะฐะดั‹ะฒะฐะตะผ ั‚ั€ะตะด ะฒ ัะฟัั‡ะบัƒ ะฝะฐ 20ะผั, ั‡ั‚ะพะฑั‹ ะดั€ัƒะณะธะต ั‚ั€ะตะดั‹
         * ะฟั€ะธะปะพะถะตะฝะธั ะฟะพะปัƒั‡ะธะปะธ ะฒั€ะตะผั ะฝะฐ ั€ะฐะฑะพั‚ัƒ. */
        ms_usleep(20000);
    }
}

เดจเดฎเตเด•เตเด•เต เดธเดฎเดพเดนเดฐเดฟเด•เตเด•เดพเด‚. เด…เดชเตเดชเต‹เตพ เดฐเดฃเตเดŸเต เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฑเตเด•เดณเดฟเตฝ เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚. เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดจเตเดจเดฟเตฝ, เดžเดพเตป เด‡เดชเตเดชเต‹เตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเตเดชเต‹เดฒเต†. เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ TShark เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต:

$ sudo tshark -i lo -f "udp dst port 7010" -P -V -O RTP -o rtp.heuristic_rtp:TRUE -x

เด•เตบเดธเต‹เดณเดฟเดฒเต† เดฒเต‹เดžเตเดšเต เดซเต€เตฝเดกเต เด•เตเดฏเดพเดชเตโ€Œเดšเดฑเดฟเดจเตเดฑเต† เด†เดฐเด‚เดญเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด’เดฐเต เดธเดจเตเดฆเต‡เดถเด‚ เดฎเดพเดคเตเดฐเดฎเต‡ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเตเดณเตเดณเต‚เดตเต†เด™เตเด•เดฟเตฝ, เด‡เดคเต เด’เดฐเต เดจเดฒเตเดฒ เด…เดŸเดฏเดพเดณเดฎเดพเดฃเต - เด…เดคเดฟเดจเตผเดคเตเดฅเด‚ เดžเด™เตเด™เดณเตเดŸเต† เดชเต‹เตผเดŸเตเดŸเต เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดฎเดฑเตเดฑเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เด•เตˆเดตเดถเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ เดŽเดจเตเดจเดพเดฃเต. เดฎเดฑเตเดฑเตŠเดฐเต เดŸเต†เตผเดฎเดฟเดจเดฒเดฟเตฝ, เดˆ เดชเต‹เตผเดŸเตเดŸเต เดจเดฎเตเดชเตผ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเด•เตเด•เตŠเดฃเตเดŸเต เด’เดฐเต "เดฑเดฟเดฎเต‹เดŸเตเดŸเต" เด‡เดจเตเดฑเตผเด•เต‹เด‚ เด…เดจเตเด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‡เตปเดธเตเดฑเตเดฑเตปเดธเต เดžเด™เตเด™เตพ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต:

$ ./mstest8 --port 9010 --lport 7010

เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดตเดพเดšเด•เดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟ IP เดตเดฟเดฒเดพเดธเด‚ 127.0.0.1 (เดฒเต‹เด•เตเด•เตฝ เดฒเต‚เดชเตเดชเตเดฌเดพเด•เตเด•เต) เด†เดฃเต.

เดฎเดฑเตเดฑเตŠเดฐเต เดŸเต†เตผเดฎเดฟเดจเดฒเดฟเตฝ, เดžเด™เตเด™เตพ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต เด’เดฐเต เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เด‰เดชเด•เดฐเดฃเด‚ เด…เดจเตเด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดŸเต†เดธเตเดฑเตเดฑเต เดœเดจเดฑเต‡เดฑเตเดฑเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด…เดงเดฟเด• เดตเดพเดฆเด‚ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต:

$ ./mstest8  --port 7010 --lport 9010 --gen 440

เดˆ เดจเดฟเดฎเดฟเดทเด‚, "เดตเดฟเดฆเต‚เดฐ" เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเดจเตเดจ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ TShark เด‰เดณเตเดณ เด•เตบเดธเต‹เดณเดฟเตฝ เดซเตเดฒเดพเดทเต เดšเต†เดฏเตเดฏเดพเตป เดคเตเดŸเด™เตเด™เดฃเด‚, เด•เต‚เดŸเดพเดคเต† เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเตผ เดธเตเดชเต€เด•เตเด•เดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเตเดŸเตผเดšเตเดšเดฏเดพเดฏ เดŸเต‹เตบ เด•เต‡เตพเด•เตเด•เตเด‚.

เดŽเดฒเตเดฒเดพเด‚ เดŽเดดเตเดคเดฟเดฏเดคเต เดชเต‹เดฒเต† เดธเด‚เดญเดตเดฟเดšเตเดšเดพเตฝ, เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเดจเตเดฑเต† เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดชเด•เตผเดชเตเดชเต เดžเด™เตเด™เตพ เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต, เดชเด•เตเดทเต‡ เด•เต€เดฏเตเด‚ เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด‚ เด‡เดฒเตเดฒเดพเดคเต† โ€œโ€”gen 440โ€. เดจเดฟเด™เตเด™เตพ เด‡เดชเตเดชเต‹เตพ เดœเดจเดฑเต‡เดฑเตเดฑเดฑเดฟเดจเตเดฑเต† เดชเด™เตเด•เต เดตเดนเดฟเด•เตเด•เตเด‚. เด‡เดคเดฟเดจเตเดถเต‡เดทเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเตˆเด•เตเดฐเต‹เดซเต‹เดฃเดฟเดฒเต‡เด•เตเด•เต เดถเดฌเตเดฆเดฎเตเดฃเตเดŸเดพเด•เตเด•เดพเด‚; เดธเตเดชเต€เด•เตเด•เดฑเดฟเดฒเต‹ เดนเต†เดกเตโ€Œเดซเต‹เดฃเดฟเดฒเต‹ เดจเดฟเด™เตเด™เตพ เด…เดจเตเดฌเดจเตเดง เดถเดฌเตเดฆเด‚ เด•เต‡เตพเด•เตเด•เดฃเด‚. เด…เด•เตเด•เต‹เดธเตเดฑเตเดฑเดฟเด•เต เดธเตเดตเดฏเด‚-เด†เดตเต‡เดถเด‚ เดชเต‹เดฒเตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เดพเด‚; เดธเตเดชเต€เด•เตเด•เตผ เดตเต‹เดณเดฟเดฏเด‚ เด•เตเดฑเดฏเตเด•เตเด•เตเด•, เดชเตเดฐเดญเดพเดตเด‚ เด…เดชเตเดฐเดคเตเดฏเด•เตเดทเดฎเดพเด•เตเด‚.

เดจเดฟเด™เตเด™เตพ เด‡เดคเต เดฐเดฃเตเดŸเต เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฑเตเด•เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดเดชเดฟ เดตเดฟเดฒเดพเดธเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด†เดถเดฏเด•เตเด•เตเดดเดชเตเดชเดคเตเดคเดฟเดฒเดพเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเดพเตฝ, เด…เดคเต‡ เดซเดฒเด‚ เดจเดฟเด™เตเด™เดณเต† เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต - เดŸเต-เดตเต‡ เดกเดฟเดœเดฟเดฑเตเดฑเตฝ เดจเดฟเดฒเดตเดพเดฐเดฎเตเดณเตเดณ เดตเต‹เดฏเตโ€Œเดธเต เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚.

เด…เดŸเตเดคเตเดค เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดžเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดซเดฟเตฝเดŸเตเดŸเดฑเตเด•เตพ เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเดพเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดชเด เดฟเด•เตเด•เตเด‚ - เดชเตเดฒเด—เดฟเดจเตเด•เตพ, เดˆ เดตเตˆเดฆเด—เตเดงเตเดฏเดคเตเดคเดฟเดจเต เดจเดจเตเดฆเดฟ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด“เดกเดฟเดฏเต‹เดฏเตเด•เตเด•เตเด‚ เดตเต€เดกเดฟเดฏเต‹เดฏเตเด•เตเด•เตเด‚ เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดฎเดฑเตเดฑเต เดšเดฟเดฒ เดชเตเดฐเดคเตเดฏเต‡เด• เดฎเต‡เด–เดฒเด•เดณเดฟเดฒเตเด‚ เดฎเต€เดกเดฟเดฏ เดธเตเดŸเตเดฐเต€เดฎเตผ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•