.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

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

เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เด†เดดเดคเตเดคเดฟเตฝ. เด•เดฃเด•เตเดทเดจเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต
เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด†เดดเดคเตเดคเดฟเตฝ. เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต
เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด†เดดเดคเตเดคเดฟเตฝ. เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดชเตเดจเดƒเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดจเตเดจเต
เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP API
เดคเต€เดฐเตเดฎเดพเดจเด‚
เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เดฒเดฟเด™เตเด•เตเด•เดณเตเด‚ เดฒเต‡เด–เดจเด™เตเด™เดณเตเด‚

เดŽเตปเดŸเตเดฐเดฟ

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

เด•เตเดฒเดฏเดจเตเดฑเต-เดธเต†เตผเดตเตผ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเต เด‡เดจเตเดฑเตผเดจเต†เดฑเตเดฑเดฟเดจเตเดฑเต† เดˆ เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เดฎเดคเดฟเดฏเดพเดฏเดคเดพเดฃเต, เด…เดตเดฟเดŸเต† เด•เตเดฒเดฏเดจเตเดฑเตเด•เตพเด•เตเด•เต เดธเตเดตเด•เดพเดฐเตเดฏ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเด•เดณเดฟเตฝ เด†เดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚, เด•เต‚เดŸเดพเดคเต† เดธเต†เตผเดตเดฑเตเด•เตพเด•เตเด•เต เด’เดฐเต เด†เด—เต‹เดณ เดตเดฟเดฒเดพเดธเดฎเตเดฃเตเดŸเต. เดŽเดจเตเดจเดพเตฝ เดฐเดฃเตเดŸเต เดจเต‹เดกเตเด•เดณเตเดŸเต† เดจเต‡เดฐเดฟเดŸเตเดŸเตเดณเตเดณ เด•เดฃเด•เตเดทเดจเตเดณเตเดณ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต เดตเดฟเดตเดฟเดง เดธเตเดตเด•เดพเดฐเตเดฏ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเด•เตพ. เดตเต‹เดฏเดฟเดธเต เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป (เดธเตเด•เตˆเดชเตเดชเต), เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฑเดฟเดฒเต‡เด•เตเด•เต เดฑเดฟเดฎเต‹เดŸเตเดŸเต เด†เด•เตเดธเดธเต เดจเต‡เดŸเตฝ (เดŸเต€เด‚เดตเตเดฏเต‚เดตเตผ) เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด“เตบเดฒเตˆเตป เด—เต†เดฏเดฟเดฎเดฟเด‚เด—เต เดชเต‹เดฒเตเดณเตเดณ เดชเดฟเดฏเตผ-เดŸเต-เดชเดฟเดฏเตผ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เต เดฐเดฃเตเดŸเต เดจเต‹เดกเตเด•เตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดจเต‡เดฐเดฟเดŸเตเดŸเตเดณเตเดณ เด•เดฃเด•เตเดทเตป เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต.

เดตเตเดฏเดคเตเดฏเดธเตเดค เดธเตเดตเด•เดพเดฐเตเดฏ เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เตเด•เดณเดฟเดฒเต† เด‰เดชเด•เดฐเดฃเด™เตเด™เตพเด•เตเด•เดฟเดŸเดฏเดฟเตฝ เดชเดฟเดฏเตผ-เดŸเต-เดชเดฟเดฏเตผ เด•เดฃเด•เตเดทเตป เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏ เดฐเต€เดคเดฟเด•เดณเดฟเดฒเตŠเดจเตเดจเดพเดฃเต เดนเต‹เตพ เดชเดžเตเดšเดฟเด‚เด—เต. UDP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเดฟเดฒเดพเดฃเต เดˆ เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต.

เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเต เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด—เตเดฏเดพเดฐเดฃเตเดŸเต€เดกเต เดกเต†เดฒเดฟเดตเดฑเดฟ เด†เดตเดถเตเดฏเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเดฟเด™เตเด™เตพ เด•เดฎเตเดชเตเดฏเต‚เดŸเตเดŸเดฑเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเตฝ เดซเดฏเดฒเตเด•เตพ เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต, เดฏเตเดกเดฟเดชเดฟ เด’เดฐเต เด—เตเดฏเดพเดฐเดฃเตเดŸเดฟ เดกเต†เดฒเดฟเดตเดฑเดฟ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด…เดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เดŸเดฟเดธเดฟเดชเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เดชเดพเด•เตเด•เดฑเตเดฑเต เดกเต†เดฒเดฟเดตเดฑเดฟ เด•เตเดฐเดฎเดคเตเดคเดฟเตฝ เดจเตฝเด•เดพเดคเตเดคเดคเดฟเดจเดพเตฝ เดฏเตเดกเดฟเดชเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเด•เตพ เด‰เดฃเตเดŸเดพเด•เตเด‚. เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ.

เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด—เตเดฏเดพเดฐเดฃเตเดŸเต€เดกเต เดชเดพเด•เตเด•เดฑเตเดฑเต เดกเต†เดฒเดฟเดตเดฑเดฟ เด‰เดฑเดชเตเดชเดพเด•เตเด•เดพเตป, เดฏเตเดกเดฟเดชเดฟเดฏเดฟเตฝ เด†เดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดคเดฏเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดตเตเด‚ เดจเตฝเด•เตเดจเตเดจ เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฒเต†เดฏเตผ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

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

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดฌเดพเด•เตเด•เดฟ เดญเดพเด—เด™เตเด™เดณเดฟเตฝ, เด—เตเดฏเดพเดฐเดฃเตเดŸเต€เดกเต เดกเต†เดฒเดฟเดตเดฑเดฟ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เดžเดพเตป เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเด‚. เดฏเตเดกเดฟเดชเดฟ เดนเต‹เตพ เดชเดžเตเดšเดฟเด‚เด—เต เดŸเต†เด•เตเดจเดฟเด•เต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฒเต‡เด–เดจเด™เตเด™เดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเด‚.

เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด†เดตเดถเตเดฏเด•เดคเด•เตพ

  1. เด’เดฐเต เดชเต‹เดธเดฟเดฑเตเดฑเต€เดตเต เดซเต€เดกเตโ€Œเดฌเดพเด•เตเด•เต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเดคเตเดคเดฟเดฒเต‚เดŸเต† เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟเดฏ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต เดกเต†เดฒเดฟเดตเดฑเดฟ (เดชเต‹เดธเดฟเดฑเตเดฑเต€เดตเต เด…เด‚เด—เต€เด•เดพเดฐเด‚ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเดต)
  2. เดตเดฒเดฟเดฏ เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏ เด•เตˆเดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเด•เดค, เด…เดคเดพเดฏเดคเต. เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด…เดจเดพเดตเดถเตเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต เดฑเดฟเดฒเต‡เดฏเดฟเด‚เด—เต เด’เดดเดฟเดตเดพเด•เตเด•เดฃเด‚
  3. เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เดธเด‚เดตเดฟเดงเดพเดจเด‚ ("เดถเตเดฆเตเดงเดฎเดพเดฏ" UDP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด†เดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต) เดฑเดฆเตเดฆเดพเด•เตเด•เตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚.
  4. เด“เดฐเต‹ เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต†เดฏเตเด‚ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเดคเตเดคเต‹เดŸเต† เด•เดฎเดพเตปเดกเต เดฎเต‹เดกเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต
  5. เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดตเดดเดฟเดฏเตเดณเตเดณ เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เดฏเต‚เดฃเดฟเดฑเตเดฑเต เด’เดฐเต เดธเดจเตเดฆเต‡เดถเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚

เดˆ เด†เดตเดถเตเดฏเด•เดคเด•เตพ เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเตเด‚ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดพ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด†เดตเดถเตเดฏเด•เดคเด•เดณเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต เด†เตผเดŽเดซเตเดธเดฟ 908 ะธ เด†เตผเดŽเดซเตเดธเดฟ 1151, เดˆ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดžเดพเตป เด† เดฎเดพเดจเดฆเดฃเตเดกเด™เตเด™เดณเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต.

เดˆ เด†เดตเดถเตเดฏเด•เดคเด•เตพ เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดพเตป, TCP, UDP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฐเดฃเตเดŸเต เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดจเต‹เดกเตเด•เตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต† เดธเดฎเดฏเด‚ เดจเต‹เด•เตเด•เดพเด‚. เดฐเดฃเตเดŸเต เดธเดพเดนเดšเดฐเตเดฏเด™เตเด™เดณเดฟเดฒเตเด‚ เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดชเดพเด•เตเด•เดฑเตเดฑเต เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเด‚.
เดŸเดฟเดธเดฟเดชเดฟ เดตเดดเดฟ เดจเต‹เตบ-เด‡เดจเตเดฑเดฑเดพเด•เตเดŸเต€เดตเต เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเตเดฑเด‚:.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

เดกเดฏเด—เตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เดชเดพเด•เตเด•เดฑเตเดฑเต เดจเดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดŸ เดชเดพเด•เตเด•เดฑเตเดฑเต TCP เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เดจเดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเตเดŸ เดธเต†เด—เตโ€Œเดฎเต†เดจเตเดฑเดฟเดจเตเดฑเต† เดจเดฎเตเดชเตผ เดšเต‹เดฆเดฟเดšเตเดšเต เด…เดฏเดšเตเดšเดฏเดพเดณเต† เด…เดฑเดฟเดฏเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.
UDP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดตเดดเดฟ เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเตเดฑเด‚:.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

UDP เดจเดทเตเดŸเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดŸเดชเดŸเดฟเด•เดณเตŠเดจเตเดจเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. UDP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดฒเต† เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดชเดฟเดถเด•เตเด•เดณเตเดŸเต† เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเดฎเดพเดฃเต.

เด’เดฐเต เดŽเตปเดกเต เดจเต‹เดกเตเดฎเดพเดฏเดฟ เด’เดฐเต เด•เดฃเด•เตเดทเตป เดธเตเดฅเดพเดชเดฟเดšเตเดšเต, เด† เด•เดฃเด•เตเดทเดจเตเดฑเต† เด…เดตเดธเตเดฅ เดธเด‚เดญเดฐเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต, เด“เดฐเต‹ เดชเดพเด•เตเด•เดฑเตเดฑเต เดนเต†เดกเดฑเดฟเดฒเตเด‚ เด…เดฏเดšเตเดš เดฌเตˆเดฑเตเดฑเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเตเด‚ เด’เดฐเต เด…เด•เตเดจเต‹เดณเดœเตเดฎเต†เดจเตเดฑเต เดจเดฎเตเดชเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฐเดธเต€เดคเตเด•เตพ เด…เดฑเดฟเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต†เดฏเตเด‚ TCP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเตฝ เดชเดฟเดถเด•เต เด•เดฃเตเดŸเต†เดคเตเดคเตฝ เดธเดพเดงเตเดฏเดฎเดพเดฃเต.

เด•เต‚เดŸเดพเดคเต†, เดชเตเดฐเด•เดŸเดจเด‚ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต (เด…เดคเดพเดฏเดคเต เด’เดฐเต เด…เด‚เด—เต€เด•เดพเดฐเด‚ เดฒเดญเดฟเด•เตเด•เดพเดคเต† เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดธเต†เด—เตโ€Œเดฎเต†เดจเตเดฑเตเด•เตพ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเด•), TCP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดตเดฟเตปเดกเต‹ เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต - เดธเต†เด—เตโ€Œเดฎเต†เดจเตเดฑเดฟเดจเตเดฑเต† เด…เดฏเด•เตเด•เตเดจเตเดจเดฏเดพเตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจ เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เดฌเตˆเดฑเตเดฑเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚.

TCP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพเด•เตเด•เต, เด•เดพเดฃเตเด• เด†เตผเดŽเดซเตเดธเดฟ 793, UDP เดฎเตเดคเตฝ เด†เตผเดŽเดซเตเดธเดฟ 768เดŽเดตเดฟเดŸเต†, เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เด…เดต เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดฎเตเด•เดณเดฟเตฝ เดชเดฑเดžเตเดžเดตเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต, UDP-เดฏเดฟเตฝ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เด’เดฐเต เดธเดจเตเดฆเต‡เดถ เดตเดฟเดคเดฐเดฃ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต (เด‡เดจเดฟ เดฎเตเดคเตฝ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP), เดŸเดฟเดธเดฟเดชเดฟเด•เตเด•เต เดธเดฎเดพเดจเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดพ เดŸเตเดฐเดพเตปเดธเตเดซเตผ เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เต‡เดฃเตเดŸเดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด…เดคเดพเดฏเดคเต:

  • เด•เดฃเด•เตเดทเตป เดจเดฟเดฒ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเด•
  • เดธเต†เด—เตเดฎเต†เดจเตเดฑเต เดจเดฎเตเดชเดฑเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•
  • เดชเตเดฐเดคเตเดฏเต‡เด• เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•
  • เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดคเตเดฐเต‚เดชเตเดŸเตเดŸเต เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดตเดฟเตปเดกเต‹ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•

เด•เต‚เดŸเดพเดคเต†, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต:

  • เด•เดฃเด•เตเดทเดจเตเดณเตเดณ เดตเดฟเดญเดตเด™เตเด™เตพ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด’เดฐเต เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด†เดฐเด‚เดญเด‚ เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เตเด•
  • เดฒเดญเดฟเดšเตเดš เดธเดจเตเดฆเต‡เดถเด‚ เด…เดชเตโ€ŒเดธเตเดŸเตเดฐเต€เด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด’เดฐเต เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจเด‚ เดธเต‚เดšเดจ เดจเตฝเด•เตเด•
  • "เดถเตเดฆเตเดงเดฎเดพเดฏ" UDP เด†เดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดพเตป เด•เดฃเด•เตเดทเตป-เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด•

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP เดคเดฒเด•เตเด•เต†เดŸเตเดŸเต

เด’เดฐเต เดฏเตเดกเดฟเดชเดฟ เดกเดพเดฑเตเดฑเด—เตเดฐเดพเด‚ เด’เดฐเต เดเดชเดฟ เดกเดพเดฑเตเดฑเดพเด—เตเดฐเดพเดฎเดฟเตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด“เตผเด•เตเด•เตเด•. เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP เดชเดพเด•เตเด•เดฑเตเดฑเต เด’เดฐเต UDP เดกเดพเดฑเตเดฑเดพเด—เตเดฐเดพเดฎเดฟเดฒเต‡เด•เตเด•เต เด‰เดšเดฟเดคเดฎเดพเดฏเดฟ "เดชเตŠเดคเดฟเดžเตเดžเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต".
เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP เดคเดฒเด•เตเด•เต†เดŸเตเดŸเต เดŽเตปเด•เตเดฏเดพเดชเตโ€Œเดธเตเดฒเต‡เดทเตป:.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP เดคเดฒเด•เตเด•เต†เดŸเตเดŸเดฟเดจเตเดฑเต† เด˜เดŸเดจ เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต:

.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

  • เดชเดคเดพเด•เด•เตพ - เดชเดพเด•เตเด•เต‡เดœเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃ เดซเตเดฒเดพเด—เตเด•เตพ
  • MessageType - เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตเดšเต†เดฏเตเดฏเดพเตป เด…เดชเตโ€ŒเดธเตเดŸเตเดฐเต€เด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดธเดจเตเดฆเต‡เดถ เดคเดฐเด‚
  • TransmissionId - เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดจเดฎเตเดชเตผ, เดธเตเดตเต€เด•เตผเดคเตเดคเดพเดตเดฟเดจเตเดฑเต† เดตเดฟเดฒเดพเดธเดตเตเด‚ เดชเต‹เตผเดŸเตเดŸเตเด‚ เดšเต‡เตผเดจเตเดจเต, เด•เดฃเด•เตเดทเดจเต† เด…เดฆเตเดตเดฟเดคเต€เดฏเดฎเดพเดฏเดฟ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเตเดจเตเดจเต
  • เดชเดพเด•เตเด•เดฑเตเดฑเต เดจเดฎเตเดชเตผ - เดชเดพเด•เตเด•เดฑเตเดฑเต เดจเดฎเตเดชเตผ
  • เด“เดชเตเดทเดจเตเด•เตพ - เด…เดงเดฟเด• เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด“เดชเตเดทเดจเตเด•เตพ. เด†เดฆเตเดฏเดคเตเดคเต† เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฒเตเดชเตเดชเด‚ เดธเต‚เดšเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต

เดชเดคเดพเด•เด•เตพ เด‡เดชเตเดฐเด•เดพเดฐเดฎเดพเดฃเต:

  • เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต - เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด†เดฆเตเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต
  • NoAsk - เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเต เด’เดฐเต เด…เด‚เด—เต€เด•เดพเดฐ เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เต‡เดฃเตเดŸ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ
  • LastPacket - เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจ เดชเดพเด•เตเด•เดฑเตเดฑเต
  • RequestForPacket - เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดŸ เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเดพเดฏเดฟ เด…เดญเตเดฏเตผเดคเตเดฅเดฟเด•เตเด•เตเด•

เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เดชเตŠเดคเต เดคเดคเตเดตเด™เตเด™เตพ

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

เด’เดฐเต เด•เดฃเด•เตเดทเตป เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดธเดฎเดพเดจเดฎเดพเดฏ เด’เดฐเต เดธเด‚เดตเดฟเดงเดพเดจเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด…เดตเดธเดพเดจ เดชเดพเด•เตเด•เดฑเตเดฑเดฟเตฝ LastPacket เดซเตเดฒเดพเด—เต เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดชเตเดฐเดคเดฟเด•เดฐเดฃ เดชเดพเด•เตเด•เดฑเตเดฑเดฟเตฝ, เด…เดตเดธเดพเดจ เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เดจเดฎเตเดชเตผ + 1 เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดตเดถเดคเตเดคเดฟเดจเต เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เดกเต†เดฒเดฟเดตเดฑเดฟ เดŽเดจเตเดจเดพเดฃเต เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเดคเต.
เด•เดฃเด•เตเดทเตป เดธเตเดฅเดพเดชเดฟเด•เตเด•เดฒเตเด‚ เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เดฒเตเด‚ เดกเดฏเด—เตเดฐเด‚:.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

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

เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดตเดถเด‚ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด“เดฐเต‹ เดชเดพเด•เตเด•เดฑเตเดฑเตเด‚ เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดตเดฟเตปเดกเต‹เดฏเดฟเตฝ เดตเต€เดดเตเดจเตเดจเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เดตเดฟเตปเดกเต‹เดฏเดฟเตฝ เดตเต€เดดเดพเดคเตเดค เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เดณเตเด‚ เดกเตเดฏเต‚เดชเตเดฒเดฟเด•เตเด•เต‡เดฑเตเดฑเตเด•เดณเตเด‚ เดซเดฟเตฝเดŸเตเดŸเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด•เดพเดฐเดฃเด‚ เดตเดฟเตปเดกเต‹เดฏเตเดŸเต† เดตเดฒเตเดชเตเดชเด‚ เดจเดฟเดถเตเดšเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเตเด‚ เดธเตเดตเต€เด•เตผเดคเตเดคเดพเดตเดฟเดจเตเด‚ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเดฏเดพเตพเด•เตเด•เตเด‚ เด’เดฐเต‡เดชเต‹เดฒเต†เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดจเดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเดพเดคเต† เดกเต†เดฒเดฟเดตเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด…เดŸเตเดคเตเดค เดกเดพเดฑเตเดฑเดพ เดฌเตเดฒเต‹เด•เตเด•เดฟเดจเตเดฑเต† เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดตเดฟเตปเดกเต‹ เดฎเดพเดฑเตเดฑเตเด•เดฏเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด‚ เด…เดฏเดšเตเดšเต. เดตเตผเด•เตเด•เต เดŸเตˆเดฎเตผ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดš เด•เดพเดฒเดฏเดณเดตเดฟเดจเตเดณเตเดณเดฟเตฝ เดตเดฟเตปเดกเต‹ เดชเต‚เดฐเดฟเดชเตเดชเดฟเดšเตเดšเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดเดคเตŠเด•เตเด•เต† เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดกเต†เดฒเดฟเดตเตผ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เดจเตเดจเต เด’เดฐเต เดชเดฐเดฟเดถเต‹เดงเดจ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดตเต€เดฃเตเดŸเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.
เดฑเต€เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดกเดฏเด—เตเดฐเด‚:.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

เดŸเตˆเด‚เด”เดŸเตเดŸเตเด•เดณเตเด‚ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดŸเตˆเดฎเดฑเตเด•เดณเตเด‚

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

เดจเต‹เดกเตเด•เตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเตเดฑเต† เด…เดญเดพเดตเดคเตเดคเดฟเตฝ เด•เดฃเด•เตเดทเตป เด…เดŸเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดŸเตˆเดฎเตผ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด…เดฏเดšเตเดšเดฏเดพเดณเต† เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดšเดฟเดŸเดคเตเดคเต‹เดณเด‚, เดตเตผเด•เตเด•เดฟเด‚เด—เต เดŸเตˆเดฎเตผ เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดŸ เด‰เดŸเตป เดคเดจเตเดจเต† เด‡เดคเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดฑเดฟเดฎเต‹เดŸเตเดŸเต เดจเต‹เดกเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดชเตเดฐเดคเดฟเด•เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด•เดพเดฒเดฏเดณเดตเดฟเดจเตเดณเตเดณเดฟเตฝ เดชเตเดฐเดคเดฟเด•เดฐเดฃเดฎเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด•เดฃเด•เตเดทเตป เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดชเตเดฑเดคเตเดคเตเดตเดฟเดŸเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚. เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดญเดพเด—เดคเตเดคเดฟเดจเต, เดตเตผเด•เตเด•เต เดŸเตˆเดฎเตผ เดฐเดฃเตเดŸเตเดคเดตเดฃ เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดŸเดคเดฟเดจเต เดถเต‡เดทเด‚ เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดŸเตˆเดฎเตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต. เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃ เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เดจเดทเตเดŸเดคเตเดคเดฟเดจเต†เดคเดฟเดฐเต† เด‡เตปเดทเตเดตเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เด‡เดคเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดŸเตˆเดฎเตผ เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ, เด•เดฃเด•เตเดทเดจเตเด‚ เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดชเตเดฑเดคเตเดคเตเดตเดฟเดŸเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เดกเดฏเด—เตเดฐเด‚

เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เดคเดคเตเดตเด™เตเด™เตพ เด’เดฐเต เดซเดฟเดจเดฟเดฑเตเดฑเต เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เดฎเต†เดทเต€เดจเดฟเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต, เด“เดฐเต‹ เด…เดตเดธเตเดฅเดฏเตเด‚ เดชเดพเด•เตเด•เดฑเตเดฑเต เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เดฟเดจเตเดฑเต† เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เดฒเต‹เดœเดฟเด•เตเด•เดฟเดจเต เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต.
เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เดกเดฏเด—เตเดฐเด‚:

.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

เด…เดŸเดšเตเดš - เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด’เดฐเต เดธเด‚เดธเตเดฅเดพเดจเดฎเดฒเตเดฒ, เด‡เดคเต เด“เดŸเตเดŸเต‹เดฎเดพเดฑเตเดฑเดฃเดฟเดจเตเดฑเต† เด†เดฐเด‚เดญเดตเตเด‚ เด…เดตเดธเดพเดจเดตเตเด‚ เด†เดฃเต. เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเต เด…เดŸเดšเตเดš เด’เดฐเต เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เด•เตบเดŸเตเดฐเต‹เตพ เดฌเตเดฒเต‹เด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เด’เดฐเต เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดฏเตเดกเดฟเดชเดฟ เดธเต†เตผเดตเตผ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดฟ, เด‰เดšเดฟเดคเดฎเดพเดฏ เด•เดฃเด•เตเดทเดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด•เตˆเดฎเดพเดฑเตเด•เดฏเตเด‚ เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต - เดธเดจเตเดฆเต‡เดถเด‚ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดฎเตเดชเต‹เตพ เด”เดŸเตเดŸเตโ€Œเด—เต‹เดฏเดฟเด‚เด—เต เด•เดฃเด•เตเดทเดจเตเดฑเต† เดชเตเดฐเดพเดฐเด‚เดญ เด…เดตเดธเตเดฅ.

เดˆ เด…เดตเดธเตเดฅเดฏเดฟเตฝ, เดธเดพเดงเดพเดฐเดฃ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพเด•เตเด•เตเดณเตเดณ เด†เดฆเตเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดšเตเดšเต. เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด‚ เด‡เดฒเตเดฒเดพเดคเตเดค เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพเด•เตเด•เต, เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเต‡เดถเดตเตเด‚ เด…เดฏเด•เตเด•เตเดจเตเดจ เด’เดฐเต‡เดฏเตŠเดฐเต เดธเด‚เดธเตเดฅเดพเดจเดฎเดพเดฃเดฟเดคเต.

เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ - เดธเดจเตเดฆเต‡เดถ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เดณเตเดŸเต† เดชเตเดฐเด•เตเดทเต‡เดชเดฃเดคเตเดคเดฟเดจเตเดณเตเดณ เด—เตเดฐเต—เดฃเตเดŸเต เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต.

เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเต เดจเดฟเดจเตเดจเต เด…เดคเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฎเดพเดฑเตเดฑเด‚ เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด†เดฆเตเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. เดˆ เด…เดตเดธเตเดฅเดฏเดฟเดฒเดพเดฃเต เดชเตเดจเดƒเดธเด‚เดชเตเดฐเต‡เด•เตเดทเดฃเดคเตเดคเดฟเดจเตเดณเตเดณ เดŽเดฒเตเดฒเดพ เด…เด‚เด—เต€เด•เดพเดฐเด™เตเด™เดณเตเด‚ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเตเด‚ เดตเดฐเตเดจเตเดจเดคเต. เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฑเดคเตเดคเตเด•เดŸเด•เตเด•เตเดจเตเดจเดคเต เดฐเดฃเตเดŸเต เดธเดจเตเดฆเตผเดญเด™เตเด™เดณเดฟเตฝ เดธเดพเดงเตเดฏเดฎเดพเดฃเต - เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เดกเต†เดฒเดฟเดตเดฑเดฟ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตฝ.

เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เดฒเดญเดฟเดšเตเดšเต - เดธเดจเตเดฆเต‡เดถเด‚ เดธเตเดตเต€เด•เตผเดคเตเดคเดพเดตเดฟเดจเตเดฑเต† เดชเตเดฐเดพเดฐเด‚เดญ เด…เดตเดธเตเดฅ.

เด‡เดคเต เดชเตเดฐเด•เตเดทเต‡เดชเดฃเดคเตเดคเดฟเดจเตเดฑเต† เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเดจเตเดฑเต† เด•เตƒเดคเตเดฏเดค เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต, เด†เดตเดถเตเดฏเดฎเดพเดฏ เด˜เดŸเดจเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต, เด†เดฆเตเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เดฐเดธเต€เดคเดฟเดฏเตเดŸเต† เด’เดฐเต เด…เด‚เด—เต€เด•เดพเดฐเด‚ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต.

เด’เดฐเตŠเดฑเตเดฑ เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดŸเด™เตเด™เดฟเดฏเดคเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เดคเต†เดณเดฟเดตเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดคเต† เด…เดฏเดšเตเดšเดคเตเดฎเดพเดฏ เด’เดฐเต เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเต, เด‡เดคเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดธเด‚เดธเตเดฅเดพเดจเด‚. เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เดธเดจเตเดฆเต‡เดถเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดค เดถเต‡เดทเด‚, เด•เดฃเด•เตเดทเตป เด…เดŸเดšเตเดšเต.

เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต - เดธเดจเตเดฆเต‡เดถ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด…เดŸเดฟเดธเตเดฅเดพเดจ เด…เดตเดธเตเดฅ.

เด‡เดคเต เดคเดพเตฝเด•เตเด•เดพเดฒเดฟเด• เดธเด‚เดญเดฐเดฃเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดŽเดดเตเดคเตเดจเตเดจเต, เดชเดพเด•เตเด•เดฑเตเดฑเต เดจเดทเตเดŸเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต, เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เดณเตเด‚ เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเต‡เดถเดตเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด…เด‚เด—เต€เด•เดพเดฐเด™เตเด™เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต, เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดŸ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดตเต€เดฃเตเดŸเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต. เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเต‡เดถเดตเตเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด•เดฃเด•เตเดทเตป เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเต‡เด•เตเด•เต เดชเต‹เด•เตเดจเตเดจเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด’เดฐเต เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตฝ เดชเตเดฑเดชเตเดชเต†เดŸเตเดจเตเดจเต.

เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ - เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเต‡เดถเดตเตเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ เด•เดฃเด•เตเดทเตป เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.

เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เด…เดธเด‚เดฌเตเดฒเดฟเด•เตเด•เตเด‚ เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด‚ เด…เดฏเดšเตเดšเดฏเดพเดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดตเดดเดฟเดฏเดฟเตฝ เดจเดทเตโ€ŒเดŸเดฎเดพเดฏ เดธเดจเตเดฆเตผเดญเดคเตเดคเดฟเดจเตเด‚ เดˆ เด…เดตเดธเตเดฅ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดˆ เด…เดตเดธเตเดฅ เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ เดชเตเดฑเดคเตเดคเตเด•เดŸเดจเตเดจเต, เดชเด•เตเดทเต‡ เด•เดฃเด•เตเดทเตป เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เด…เดตเดธเดพเดจเดฟเดšเตเดšเดคเดพเดฏเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเต.

เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เด†เดดเดคเตเดคเดฟเตฝ. เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เด•เตบเดŸเตเดฐเต‹เตพ เดฏเต‚เดฃเดฟเดฑเตเดฑเต

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดฏเตเดกเดฟเดชเดฟเดฏเตเดŸเต† เดชเตเดฐเดงเดพเดจ เด˜เดŸเด•เด™เตเด™เดณเดฟเดฒเตŠเดจเตเดจเดพเดฃเต เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เด•เตบเดŸเตเดฐเต‹เตพ เดฌเตเดฒเต‹เด•เตเด•เต. เดจเดฟเดฒเดตเดฟเดฒเต† เด•เดฃเด•เตเดทเดจเตเด•เดณเตเด‚ เดธเดนเดพเดฏ เด˜เดŸเด•เด™เตเด™เดณเตเด‚ เดธเด‚เดญเดฐเดฟเด•เตเด•เตเด•, เด…เดจเตเดฌเดจเตเดง เด•เดฃเด•เตเดทเดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด‡เตปเด•เดฎเดฟเด‚เด—เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดฏเตเด•, เด’เดฐเต เด•เดฃเด•เตเดทเดจเดฟเดฒเต‡เด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดจเตฝเด•เตเด•, เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ API เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด• เดŽเดจเตเดจเดฟเดตเดฏเดพเดฃเต เดˆ เดฌเตเดฒเต‹เด•เตเด•เดฟเดจเตเดฑเต† เดšเตเดฎเดคเดฒ. เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เด•เตบเดŸเตเดฐเต‹เตพ เดฌเตเดฒเต‹เด•เตเด•เต เดฏเตเดกเดฟเดชเดฟ เดฒเต†เดฏเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เดฟเดจเดพเดฏเดฟ เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เดฎเต†เดทเต€เดจเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด‡เดคเต เด’เดฐเต เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดฏเตเดกเดฟเดชเดฟ เดธเต†เตผเดตเตผ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต.
ReliableUdpConnectionControlBlock เด•เตเดฒเดพเดธเดฟเดฒเต† เดšเดฟเดฒ เด…เด‚เด—เด™เตเด™เตพ:

internal class ReliableUdpConnectionControlBlock : IDisposable
{
  // ะผะฐััะธะฒ ะฑะฐะนั‚ ะดะปั ัƒะบะฐะทะฐะฝะฝะพะณะพ ะบะปัŽั‡ะฐ. ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ัะฑะพั€ะบะธ ะฒั…ะพะดัั‰ะธั… ัะพะพะฑั‰ะตะฝะธะน    
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> IncomingStreams { get; private set;}
  // ะผะฐััะธะฒ ะฑะฐะนั‚ ะดะปั ัƒะบะฐะทะฐะฝะฝะพะณะพ ะบะปัŽั‡ะฐ. ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ะพั‚ะฟั€ะฐะฒะบะธ ะธัั…ะพะดัั‰ะธั… ัะพะพะฑั‰ะตะฝะธะน.
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> OutcomingStreams { get; private set; }
  // connection record ะดะปั ัƒะบะฐะทะฐะฝะฝะพะณะพ ะบะปัŽั‡ะฐ.
  private readonly ConcurrentDictionary<Tuple<EndPoint, Int32>, ReliableUdpConnectionRecord> m_listOfHandlers;
  // ัะฟะธัะพะบ ะฟะพะดะฟะธัั‡ะธะบะพะฒ ะฝะฐ ัะพะพะฑั‰ะตะฝะธั.
  private readonly List<ReliableUdpSubscribeObject> m_subscribers;    
  // ะปะพะบะฐะปัŒะฝั‹ะน ัะพะบะตั‚    
  private Socket m_socketIn;
  // ะฟะพั€ั‚ ะดะปั ะฒั…ะพะดัั‰ะธั… ัะพะพะฑั‰ะตะฝะธะน
  private int m_port;
  // ะปะพะบะฐะปัŒะฝั‹ะน IP ะฐะดั€ะตั
  private IPAddress m_ipAddress;    
  // ะปะพะบะฐะปัŒะฝะฐั ะบะพะฝะตั‡ะฝะฐั ั‚ะพั‡ะบะฐ    
  public IPEndPoint LocalEndpoint { get; private set; }    
  // ะบะพะปะปะตะบั†ะธั ะฟั€ะตะดะฒะฐั€ะธั‚ะตะปัŒะฝะพ ะธะฝะธั†ะธะฐะปะธะทะธั€ะพะฒะฐะฝะฝั‹ั…
  // ัะพัั‚ะพัะฝะธะน ะบะพะฝะตั‡ะฝะพะณะพ ะฐะฒั‚ะพะผะฐั‚ะฐ
  public StatesCollection States { get; private set; }
  // ะณะตะฝะตั€ะฐั‚ะพั€ ัะปัƒั‡ะฐะนะฝั‹ั… ั‡ะธัะตะป. ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ัะพะทะดะฐะฝะธั TransmissionId
  private readonly RNGCryptoServiceProvider m_randomCrypto;    	
  //...
}

เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดฏเตเดกเดฟเดชเดฟ เดธเต†เตผเดตเตผ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ:

private void Receive()
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  // ัะพะทะดะฐะตะผ ะฝะพะฒั‹ะน ะฑัƒั„ะตั€, ะดะปั ะบะฐะถะดะพะณะพ socket.BeginReceiveFrom 
  byte[] buffer = new byte[DefaultMaxPacketSize + ReliableUdpHeader.Length];
  // ะฟะตั€ะตะดะฐะตะผ ะฑัƒั„ะตั€ ะฒ ะบะฐั‡ะตัั‚ะฒะต ะฟะฐั€ะฐะผะตั‚ั€ะฐ ะดะปั ะฐัะธะฝั…ั€ะพะฝะฝะพะณะพ ะผะตั‚ะพะดะฐ
  this.m_socketIn.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref connectedClient, EndReceive, buffer);
}   

private void EndReceive(IAsyncResult ar)
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  int bytesRead = this.m_socketIn.EndReceiveFrom(ar, ref connectedClient);
  //ะฟะฐะบะตั‚ ะฟะพะปัƒั‡ะตะฝ, ะณะพั‚ะพะฒั‹ ะฟั€ะธะฝะธะผะฐั‚ัŒ ัะปะตะดัƒัŽั‰ะธะน        
  Receive();
  // ั‚.ะบ. ะฟั€ะพัั‚ะตะนัˆะธะน ัะฟะพัะพะฑ ั€ะตัˆะธั‚ัŒ ะฒะพะฟั€ะพั ั ะฑัƒั„ะตั€ะพะผ - ะฟะพะปัƒั‡ะธั‚ัŒ ััั‹ะปะบัƒ ะฝะฐ ะฝะตะณะพ 
  // ะธะท IAsyncResult.AsyncState        
  byte[] bytes = ((byte[]) ar.AsyncState).Slice(0, bytesRead);
  // ะฟะพะปัƒั‡ะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตั‚ะฐ        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // ะฟั€ะธัˆะตะป ะฝะตะบะพั€ั€ะตะบั‚ะฝั‹ะน ะฟะฐะบะตั‚ - ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะตะณะพ
    return;
  }
  // ะบะพะฝัั‚ั€ัƒะธั€ัƒะตะผ ะบะปัŽั‡ ะดะปั ะพะฟั€ะตะดะตะปะตะฝะธั connection recordโ€™ะฐ ะดะปั ะฟะฐะบะตั‚ะฐ
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // ะฟะพะปัƒั‡ะฐะตะผ ััƒั‰ะตัั‚ะฒัƒัŽั‰ัƒัŽ connection record ะธะปะธ ัะพะทะดะฐะตะผ ะฝะพะฒัƒัŽ
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header.ReliableUdpMessageType));
  // ะทะฐะฟัƒัะบะฐะตะผ ะฟะฐะบะตั‚ ะฒ ะพะฑั€ะฐะฑะพั‚ะบัƒ ะฒ ะบะพะฝะตั‡ะฝั‹ะน ะฐะฒั‚ะพะผะฐั‚
  record.State.ReceivePacket(record, header, bytes);
}

เด“เดฐเต‹ เดธเดจเตเดฆเต‡เดถ เด•เตˆเดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเด‚, เด•เดฃเด•เตเดทเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดตเดฟเดตเดฐเด™เตเด™เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจ เด’เดฐเต เด˜เดŸเดจ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต. เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด˜เดŸเดจเดฏเต† เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต เด•เดฃเด•เตเดทเตป เดฑเต†เด•เตเด•เต‹เตผเดกเต.
ReliableUdpConnectionRecord เด•เตเดฒเดพเดธเดฟเดฒเต† เดšเดฟเดฒ เด…เด‚เด—เด™เตเด™เตพ:

internal class ReliableUdpConnectionRecord : IDisposable
{    
  // ะผะฐััะธะฒ ะฑะฐะนั‚ ั ัะพะพะฑั‰ะตะฝะธะตะผ    
  public byte[] IncomingStream { get; set; }
  // ััั‹ะปะบะฐ ะฝะฐ ัะพัั‚ะพัะฝะธะต ะบะพะฝะตั‡ะฝะพะณะพ ะฐะฒั‚ะพะผะฐั‚ะฐ    
  public ReliableUdpState State { get; set; }    
  // ะฟะฐั€ะฐ, ะพะดะฝะพะทะฝะฐั‡ะฝะพ ะพะฟั€ะตะดะตะปััŽั‰ะฐั connection record
  // ะฒ ะฑะปะพะบะต ัƒะฟั€ะฐะฒะปะตะฝะธั ะฟะตั€ะตะดะฐั‡ะตะน     
  public Tuple<EndPoint, Int32> Key { get; private set;}
  // ะฝะธะถะฝัั ะณั€ะฐะฝะธั†ะฐ ะฟั€ะธะตะผะฝะพะณะพ ะพะบะฝะฐ    
  public int WindowLowerBound;
  // ั€ะฐะทะผะตั€ ะพะบะฝะฐ ะฟะตั€ะตะดะฐั‡ะธ
  public readonly int WindowSize;     
  // ะฝะพะผะตั€ ะฟะฐะบะตั‚ะฐ ะดะปั ะพั‚ะฟั€ะฐะฒะบะธ
  public int SndNext;
  // ะบะพะปะธั‡ะตัั‚ะฒะพ ะฟะฐะบะตั‚ะพะฒ ะดะปั ะพั‚ะฟั€ะฐะฒะบะธ
  public int NumberOfPackets;
  // ะฝะพะผะตั€ ะฟะตั€ะตะดะฐั‡ะธ (ะธะผะตะฝะฝะพ ะพะฝ ะธ ะตัั‚ัŒ ะฒั‚ะพั€ะฐั ั‡ะฐัั‚ัŒ Tuple)
  // ะดะปั ะบะฐะถะดะพะณะพ ัะพะพะฑั‰ะตะฝะธั ัะฒะพะน	
  public readonly Int32 TransmissionId;
  // ัƒะดะฐะปะตะฝะฝั‹ะน IP endpoint โ€“ ัะพะฑัั‚ะฒะตะฝะฝะพ ะฟะพะปัƒั‡ะฐั‚ะตะปัŒ ัะพะพะฑั‰ะตะฝะธั
  public readonly IPEndPoint RemoteClient;
  // ั€ะฐะทะผะตั€ ะฟะฐะบะตั‚ะฐ, ะฒะพ ะธะทะฑะตะถะฐะฝะธะต ั„ั€ะฐะณะผะตะฝั‚ะฐั†ะธะธ ะฝะฐ IP ัƒั€ะพะฒะฝะต
  // ะฝะต ะดะพะปะถะตะฝ ะฟั€ะตะฒั‹ัˆะฐั‚ัŒ MTU โ€“ (IP.Header + UDP.Header + RelaibleUDP.Header)
  public readonly int BufferSize;
  // ะฑะปะพะบ ัƒะฟั€ะฐะฒะปะตะฝะธั ะฟะตั€ะตะดะฐั‡ะตะน
  public readonly ReliableUdpConnectionControlBlock Tcb;
  // ะธะฝะบะฐะฟััƒะปะธั€ัƒะตั‚ ั€ะตะทัƒะปัŒั‚ะฐั‚ั‹ ะฐัะธะฝั…ั€ะพะฝะฝะพะน ะพะฟะตั€ะฐั†ะธะธ ะดะปั BeginSendMessage/EndSendMessage
  public readonly AsyncResultSendMessage AsyncResult;
  // ะฝะต ะพั‚ะฟั€ะฐะฒะปัั‚ัŒ ะฟะฐะบะตั‚ั‹ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั
  public bool IsNoAnswerNeeded;
  // ะฟะพัะปะตะดะฝะธะน ะบะพั€ั€ะตะบั‚ะฝะพ ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ะฟะฐะบะตั‚ (ะฒัะตะณะดะฐ ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ัั ะฒ ะฝะฐะธะฑะพะปัŒัˆะธะน ะฝะพะผะตั€)
  public int RcvCurrent;
  // ะผะฐััะธะฒ ั ะฝะพะผะตั€ะฐะผะธ ะฟะพั‚ะตั€ัะฝะฝั‹ั… ะฟะฐะบะตั‚ะพะฒ
  public int[] LostPackets { get; private set; }
  // ะฟั€ะธัˆะตะป ะปะธ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚. ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะบะฐะบ bool.
  public int IsLastPacketReceived = 0;
  //...
}

เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด†เดดเดคเตเดคเดฟเตฝ. เดชเตเดฐเดธเตเดคเดพเดตเดฟเด•เตเด•เตเดจเตเดจเต

เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เดณเตเดŸเต† เดชเตเดฐเดงเดพเดจ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดจเดŸเด•เตเด•เตเดจเตเดจ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดฏเตเดกเดฟเดชเดฟ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเต เดฎเต†เดทเต€เตป เดธเด‚เดธเตเดฅเดพเดจเด™เตเด™เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต. ReliableUdpState เดŽเดจเตเดจ เด…เดฎเต‚เตผเดคเตเดค เด•เตเดฒเดพเดธเต เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเต เด’เดฐเต เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดจเตฝเด•เตเดจเตเดจเต:

.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เดฎเตเดดเตเดตเตป เดฒเต‹เดœเดฟเด•เตเด•เตเด‚ เดฎเตเด•เดณเดฟเตฝ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเดšเตเดš เด•เตเดฒเดพเดธเตเด•เดณเดพเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดฐเต€เดคเดฟเด•เตพ เดจเตฝเด•เตเดจเตเดจ เด’เดฐเต เด“เด•เตเดธเดฟเดฒเดฑเดฟ เด•เตเดฒเดพเดธเดฟเดจเตŠเดชเตเดชเด‚, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เด•เดฃเด•เตเดทเตป เดฑเต†เด•เตเด•เต‹เตผเดกเดฟเตฝ เดจเดฟเดจเตเดจเต ReliableUdp เดคเดฒเด•เตเด•เต†เดŸเตเดŸเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเต.

เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เด…เตฝเด—เต‹เดฐเดฟเดคเด™เตเด™เตพ เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเดจเตเดจ เด‡เดจเตเดฑเตผเดซเต‡เดธเต เดฐเต€เดคเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต เดžเด™เตเด™เตพ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด‚.

DisposeByTimeout เดฐเต€เดคเดฟ

DisposeByTimeout เดฐเต€เดคเดฟ เด’เดฐเต เดธเดฎเดฏเดชเดฐเดฟเดงเดฟเด•เตเด•เต เดถเต‡เดทเด‚ เด•เดฃเด•เตเดทเตป เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ/เดชเดฐเดพเดœเดฏเดชเตเดชเต†เดŸเตเดŸ เดธเดจเตเดฆเต‡เดถ เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเดฟเด—เตเดจเตฝ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต.
ReliableUdpState.DisposeByTimeout:

protected virtual void DisposeByTimeout(object record)
{
  ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;      
  if (record.AsyncResult != null)
  {
    connectionRecord.AsyncResult.SetAsCompleted(false);
  }
  connectionRecord.Dispose();
}

เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเต เด…เดคเต เดฎเดฑเดฟเด•เดŸเด•เตเด•เตเด• เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ.
เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ. เดธเดฎเดฏเดชเดฐเดฟเดงเดฟ เดชเตเดฐเด•เดพเดฐเด‚ เดกเดฟเดธเตเดชเต‹เดธเต เดšเต†เดฏเตเดฏเตเด•:

protected override void DisposeByTimeout(object record)
{
  ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;
  // ัะพะพะฑั‰ะฐะตะผ ะพะฑ ัƒัะฟะตัˆะฝะพะผ ะฟะพะปัƒั‡ะตะฝะธะธ ัะพะพะฑั‰ะตะฝะธั
  SetAsCompleted(connectionRecord);        
}

ProcessPackets เดฐเต€เดคเดฟ

เด’เดฐเต เดชเดพเด•เตเด•เต‡เดœเดฟเดจเตเดฑเต†เดฏเต‹ เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเตเดŸเต†เดฏเต‹ เด…เดงเดฟเด• เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เดฟเดจเต เดชเตเดฐเต‹เดธเดธเตเดชเดพเด•เตเด•เดฑเตเดฑเตเดธเต เดฐเต€เดคเดฟ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต. เดจเต‡เดฐเดฟเดŸเตเดŸเต‹ เด’เดฐเต เดชเดพเด•เตเด•เดฑเตเดฑเต เดตเต†เดฏเตเดฑเตเดฑเต เดŸเตˆเดฎเตผ เดตเดดเดฟเดฏเต‹ เดตเดฟเดณเดฟเดšเตเดšเต.

เด•เดดเดฟเดตเตเดณเตเดณ เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เดˆ เดฐเต€เดคเดฟ เด…เดธเดพเดงเตเดตเดพเด•เตเด•เตเด•เดฏเตเด‚ เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดŸ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเต‡เด•เตเด•เต เดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเตเด‚ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ, เด…เดตเดธเดพเดจ เดชเดพเด•เตเด•เดฑเตเดฑเต เดฒเดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เด’เดฐเต เดšเต†เด•เตเด•เต เดชเดพเดธเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเดพเตฝ
เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต.เดชเตเดฐเต‹เดธเดธเตเดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.IsDone != 0)
    return;
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // ะตัั‚ัŒ ะฟะพั‚ะตั€ัะฝะฝั‹ะต ะฟะฐะบะตั‚ั‹, ะพั‚ัั‹ะปะฐะตะผ ะทะฐะฟั€ะพัั‹ ะฝะฐ ะฝะธั…
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั‚ะฐะนะผะตั€ ะฒะพ ะฒั‚ะพั€ะพะน ั€ะฐะท, ะดะปั ะฟะพะฒั‚ะพั€ะฝะพะน ะฟะพะฟั‹ั‚ะบะธ ะฟะตั€ะตะดะฐั‡ะธ
    if (!connectionRecord.TimerSecondTry)
    {
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // ะตัะปะธ ะฟะพัะปะต ะดะฒัƒั… ะฟะพะฟั‹ั‚ะพะบ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธะน WaitForPacketTimer 
    // ะฝะต ัƒะดะฐะปะพััŒ ะฟะพะปัƒั‡ะธั‚ัŒ ะฟะฐะบะตั‚ั‹ - ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะทะฐะฒะตั€ัˆะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
    StartCloseWaitTimer(connectionRecord);
  }
  else if (connectionRecord.IsLastPacketReceived != 0)
  // ัƒัะฟะตัˆะฝะฐั ะฟั€ะพะฒะตั€ะบะฐ 
  {
    // ะฒั‹ัั‹ะปะฐะตะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต ะพ ะฟะพะปัƒั‡ะตะฝะธะธ ะฑะปะพะบะฐ ะดะฐะฝะฝั‹ั…
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.State = connectionRecord.Tcb.States.Completed;
    connectionRecord.State.ProcessPackets(connectionRecord);
    // ะฒะผะตัั‚ะพ ะผะพะผะตะฝั‚ะฐะปัŒะฝะพะน ั€ะตะฐะปะธะทะฐั†ะธะธ ั€ะตััƒั€ัะพะฒ
    // ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€, ะฝะฐ ัะปัƒั‡ะฐะน, ะตัะปะธ
    // ะตัะปะธ ะฟะพัะปะตะดะฝะธะน ack ะฝะต ะดะพะนะดะตั‚ ะดะพ ะพั‚ะฟั€ะฐะฒะธั‚ะตะปั ะธ ะพะฝ ะทะฐะฟั€ะพัะธั‚ ะตะณะพ ัะฝะพะฒะฐ.
    // ะฟะพ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธัŽ ั‚ะฐะนะผะตั€ะฐ - ั€ะตะฐะปะธะทัƒะตะผ ั€ะตััƒั€ัั‹
    // ะฒ ัะพัั‚ะพัะฝะธะธ Completed ะผะตั‚ะพะด ั‚ะฐะนะผะตั€ะฐ ะฟะตั€ะตะพะฟั€ะตะดะตะปะตะฝ
    StartCloseWaitTimer(connectionRecord);
  }
  // ัั‚ะพ ัะปัƒั‡ะฐะน, ะบะพะณะดะฐ ack ะฝะฐ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ ะฑั‹ะป ะฟะพั‚ะตั€ัะฝ
  else
  {
    if (!connectionRecord.TimerSecondTry)
    {
      ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะทะฐะฒะตั€ัˆะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
    StartCloseWaitTimer(connectionRecord);
  }
}

เด•เดดเดฟเดตเตเดณเตเดณ เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ เดˆ เดฐเต€เดคเดฟ เด’เดฐเต เดŸเตˆเดฎเดฑเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เดตเดฟเดณเดฟเด•เตเด•เต‚, เด…เดตเดธเดพเดจ เดธเดจเตเดฆเต‡เดถเด‚ เดตเต€เดฃเตเดŸเตเด‚ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดŸเตˆเดฎเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด‡เดคเต เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต.
SendingCycle.ProcessPackets:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.IsDone != 0)
    return;        
  // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฟะพะฒั‚ะพั€ะฝะพ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚ 
  // ( ะฒ ัะปัƒั‡ะฐะต ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ัƒะทะตะป-ะฟั€ะธะตะผะฝะธะบ ะทะฐะฝะพะฒะพ ะพั‚ะฟั€ะฐะฒะธั‚ ะทะฐะฟั€ะพัั‹, ะบะพั‚ะพั€ั‹ะต ะดะพ ะฝะตะณะพ ะฝะต ะดะพัˆะปะธ)        
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, connectionRecord.SndNext - 1));
  // ะฒะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€ CloseWait โ€“ ะดะปั ะพะถะธะดะฐะฝะธั ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ะธะปะธ ะตะณะพ ะทะฐะฒะตั€ัˆะตะฝะธั
  StartCloseWaitTimer(connectionRecord);
}

เด•เดดเดฟเดตเตเดณเตเดณ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ เดˆ เดฐเต€เดคเดฟ เดฑเดฃเตเดฃเดฟเด‚เด—เต เดŸเตˆเดฎเตผ เดจเดฟเตผเดคเตเดคเตเด•เดฏเตเด‚ เดตเดฐเดฟเด•เตเด•เดพเตผเด•เตเด•เต เดธเดจเตเดฆเต‡เดถเด‚ เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ.เดชเตเดฐเต‹เดธเดธเตเดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.WaitForPacketsTimer != null)
    connectionRecord.WaitForPacketsTimer.Dispose();
  // ัะพะฑะธั€ะฐะตะผ ัะพะพะฑั‰ะตะฝะธะต ะธ ะฟะตั€ะตะดะฐะตะผ ะตะณะพ ะฟะพะดะฟะธัั‡ะธะบะฐะผ
  ReliableUdpStateTools.CreateMessageFromMemoryStream(connectionRecord);
}

เดฑเดฟเดธเต€เดตเต เดชเดพเด•เตเด•เดฑเตเดฑเต เดฐเต€เดคเดฟ

เด•เดดเดฟเดตเตเดณเตเดณ เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เดฒเดญเดฟเดšเตเดšเต เด†เดฆเตเดฏ เดธเดจเตเดฆเต‡เดถ เดชเดพเด•เตเด•เดฑเตเดฑเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเตฝ เดŽเดคเตเดคเดฟเดฏเต‹ เดŽเดจเตเดจเต เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเด•, เด•เต‚เดŸเดพเดคเต† เด’เดฐเตŠเดฑเตเดฑ เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดŸเด™เตเด™เดฟเดฏ เด’เดฐเต เดธเดจเตเดฆเต‡เดถเด‚ เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดฐเต€เดคเดฟเดฏเตเดŸเต† เดชเตเดฐเดงเดพเดจ เดฆเตŒเดคเตเดฏเด‚.
เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เดฒเดญเดฟเดšเตเดšเต. เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเดพเด•เตเด•เดฑเตเดฑเต:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะฟะฐะบะตั‚
    return;
  // ะบะพะผะฑะธะฝะฐั†ะธั ะดะฒัƒั… ั„ะปะฐะณะพะฒ - FirstPacket ะธ LastPacket - ะณะพะฒะพั€ะธั‚ ั‡ั‚ะพ ัƒ ะฝะฐั ะตะดะธะฝัั‚ะฒะตะฝะฝะพะต ัะพะพะฑั‰ะตะฝะธะต
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) &
      header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    ReliableUdpStateTools.CreateMessageFromSinglePacket(connectionRecord, header, payload.Slice(ReliableUdpHeader.Length, payload.Length));
    if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
    {
      // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฟะฐะบะตั‚ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต          
      ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    }
    SetAsCompleted(connectionRecord);
    return;
  }
  // by design ะฒัะต packet numbers ะฝะฐั‡ะธะฝะฐัŽั‚ัั ั 0;
  if (header.PacketNumber != 0)          
    return;
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ัั‡ะธั‚ะฐะตะผ ะบะพะป-ะฒะพ ะฟะฐะบะตั‚ะพะฒ, ะบะพั‚ะพั€ั‹ะต ะดะพะปะถะฝั‹ ะฟั€ะธะนั‚ะธ
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฝะพะผะตั€ ะฟะพัะปะตะดะฝะตะณะพ ะฟะพะปัƒั‡ะตะฝะฝะพะณะพ ะฟะฐะบะตั‚ะฐ (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // ะฟะพัะปะต ัะดะฒะธะฝัƒะปะธ ะพะบะฝะพ ะฟั€ะธะตะผะฐ ะฝะฐ 1
  connectionRecord.WindowLowerBound++;
  // ะฟะตั€ะตะบะปัŽั‡ะฐะตะผ ัะพัั‚ะพัะฝะธะต
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;
  // ะตัะปะธ ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั ะผะตั…ะฐะฝะธะทะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต
  // ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะบะพั‚ะพั€ั‹ะน ะฒั‹ัะฒะพะฑะพะดะธั‚ ะฒัะต ัั‚ั€ัƒะบั‚ัƒั€ั‹         
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
  {
    connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
  else
  {
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

เด•เดดเดฟเดตเตเดณเตเดณ เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ เดกเต†เดฒเดฟเดตเดฑเดฟ เด…เด‚เด—เต€เด•เดพเดฐเด™เตเด™เดณเตเด‚ เดฑเต€เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเตเด‚ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดˆ เดฐเต€เดคเดฟ เด…เดธเดพเดงเตเดตเดพเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.
SendingCycle.ReceivePacket:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (connectionRecord.IsDone != 0)
    return;
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.RequestForPacket))
    return;
  // ั€ะฐัั‡ะตั‚ ะบะพะฝะตั‡ะฝะพะน ะณั€ะฐะฝะธั†ั‹ ะพะบะฝะฐ
  // ะฑะตั€ะตั‚ัั ะณั€ะฐะฝะธั†ะฐ ะพะบะฝะฐ + 1, ะดะปั ะฟะพะปัƒั‡ะตะฝะธั ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะน ะดะพัั‚ะฐะฒะบะธ
  int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize), (connectionRecord.NumberOfPackets));
  // ะฟั€ะพะฒะตั€ะบะฐ ะฝะฐ ะฟะพะฟะฐะดะฐะฝะธะต ะฒ ะพะบะฝะพ        
  if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > windowHighestBound)
    return;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ะฟั€ะพะฒะตั€ะธั‚ัŒ ะฝะฐ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚:
  if (header.PacketNumber == connectionRecord.NumberOfPackets)
  {
    // ะฟะตั€ะตะดะฐั‡ะฐ ะทะฐะฒะตั€ัˆะตะฝะฐ
    Interlocked.Increment(ref connectionRecord.IsDone);
    SetAsCompleted(connectionRecord);
    return;
  }
  // ัั‚ะพ ะพั‚ะฒะตั‚ ะฝะฐ ะฟะตั€ะฒั‹ะน ะฟะฐะบะตั‚ c ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะตะผ         
  if ((header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) && header.PacketNumber == 1))
  {
    // ะฑะตะท ัะดะฒะธะณะฐ ะพะบะฝะฐ
    SendPacket(connectionRecord);
  }
  // ะฟั€ะธัˆะปะพ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต ะพ ะฟะพะปัƒั‡ะตะฝะธะธ ะฑะปะพะบะฐ ะดะฐะฝะฝั‹ั…
  else if (header.PacketNumber == windowHighestBound)
  {
    // ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ ะฟั€ะธะตะผ/ะฟะตั€ะตะดะฐั‡ะธ
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ะพะฑะฝัƒะปัะตะผ ะผะฐััะธะฒ ะบะพะฝั‚ั€ะพะปั ะฟะตั€ะตะดะฐั‡ะธ
    connectionRecord.WindowControlArray.Nullify();
    // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ
    SendPacket(connectionRecord);
  }
  // ัั‚ะพ ะทะฐะฟั€ะพั ะฝะฐ ะฟะพะฒั‚ะพั€ะฝัƒัŽ ะฟะตั€ะตะดะฐั‡ัƒ โ€“ ะพั‚ะฟั€ะฐะฒะปัะตะผ ั‚ั€ะตะฑัƒะตะผั‹ะน ะฟะฐะบะตั‚          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

เด•เดดเดฟเดตเตเดณเตเดณ เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เดฑเดฟเดธเต€เดตเตเดชเดพเด•เตเด•เดฑเตเดฑเต เดฐเต€เดคเดฟเดฏเดฟเตฝ, เด‡เตปเด•เดฎเดฟเด‚เด—เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดธเดจเตเดฆเต‡เดถเด‚ เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เดœเต‹เดฒเดฟ เดจเดŸเด•เตเด•เตเดจเตเดจเต.
เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต.เดฑเดฟเดธเต€เดตเตเดชเดพเด•เตเด•เดฑเตเดฑเต:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (connectionRecord.IsDone != 0)
    return;
  // ะพะฑั€ะฐะฑะพั‚ะบะฐ ะฟะฐะบะตั‚ะพะฒ ั ะพั‚ะบะปัŽั‡ะตะฝะฝั‹ะผ ะผะตั…ะฐะฝะธะทะผะพะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั ะดะพัั‚ะฐะฒะบะธ
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
  {
    // ัะฑั€ะฐัั‹ะฒะฐะตะผ ั‚ะฐะนะผะตั€
    connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
    // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะดะฐะฝะฝั‹ะต
    ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
    // ะตัะปะธ ะฟะพะปัƒั‡ะธะปะธ ะฟะฐะบะตั‚ ั ะฟะพัะปะตะดะฝะธะผ ั„ะปะฐะณะพะผ - ะดะตะปะฐะตะผ ะทะฐะฒะตั€ัˆะฐะตะผ          
    if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
    {
      connectionRecord.State = connectionRecord.Tcb.States.Completed;
      connectionRecord.State.ProcessPackets(connectionRecord);
    }
    return;
  }        
  // ั€ะฐัั‡ะตั‚ ะบะพะฝะตั‡ะฝะพะน ะณั€ะฐะฝะธั†ั‹ ะพะบะฝะฐ
  int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize - 1), (connectionRecord.NumberOfPackets - 1));
  // ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะฝะต ะฟะพะฟะฐะดะฐัŽั‰ะธะต ะฒ ะพะบะฝะพ ะฟะฐะบะตั‚ั‹
  if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > (windowHighestBound))
    return;
  // ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะดัƒะฑะปะธะบะฐั‚ั‹
  if (connectionRecord.WindowControlArray.Contains(header.PacketNumber))
    return;
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะดะฐะฝะฝั‹ะต 
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ ะฟะฐะบะตั‚ะพะฒ        
  connectionRecord.PacketCounter++;
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฒ ะผะฐััะธะฒ ัƒะฟั€ะฐะฒะปะตะฝะธั ะพะบะฝะพะผ ั‚ะตะบัƒั‰ะธะน ะฝะพะผะตั€ ะฟะฐะบะตั‚ะฐ        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐะธะฑะพะปัŒัˆะธะน ะฟั€ะธัˆะตะดัˆะธะน ะฟะฐะบะตั‚        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // ะฟะตั€ะตะทะฐะฟัƒัะบะฐะผ ั‚ะฐะนะผะตั€ั‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ะตัะปะธ ะฟั€ะธัˆะตะป ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    Interlocked.Increment(ref connectionRecord.IsLastPacketReceived);
  }
  // ะตัะปะธ ะฝะฐะผ ะฟั€ะธัˆะปะธ ะฒัะต ะฟะฐะบะตั‚ั‹ ะพะบะฝะฐ, ั‚ะพ ัะฑั€ะฐัั‹ะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
  // ะธ ะฒั‹ัั‹ะปะฐะตะผ ะฟะฐะบะตั‚ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // ัะฑั€ะฐัั‹ะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ.      
    connectionRecord.PacketCounter = 0;
    // ัะดะฒะธะฝัƒะปะธ ะพะบะฝะพ ะฟะตั€ะตะดะฐั‡ะธ
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ะพะฑะฝัƒะปะตะฝะธะต ะผะฐััะธะฒะฐ ัƒะฟั€ะฐะฒะปะตะฝะธั ะฟะตั€ะตะดะฐั‡ะตะน
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // ะตัะปะธ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚ ัƒะถะต ะธะผะตะตั‚ัั        
  if (Thread.VolatileRead(ref connectionRecord.IsLastPacketReceived) != 0)
  {
    // ะฟั€ะพะฒะตั€ัะตะผ ะฟะฐะบะตั‚ั‹          
    ProcessPackets(connectionRecord);
  }
}

เด•เดดเดฟเดตเตเดณเตเดณ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เดกเต†เดฒเดฟเดตเดฑเดฟเด•เตเด•เต เดตเต€เดฃเตเดŸเตเด‚ เด…เด‚เด—เต€เด•เดพเดฐเด‚ เด…เดฏเดฏเตเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดˆ เดฐเต€เดคเดฟเดฏเตเดŸเต† เด’เดฐเต‡เดฏเตŠเดฐเต เดšเตเดฎเดคเดฒ.
เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ. เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเดพเด•เตเด•เดฑเตเดฑเต:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ะฟะพะฒั‚ะพั€ะฝะฐั ะพั‚ะฟั€ะฐะฒะบะฐ ะฟะพัะปะตะดะฝะตะณะพ ะฟะฐะบะตั‚ะฐ ะฒ ัะฒัะทะธ ั ั‚ะตะผ,
  // ั‡ั‚ะพ ะฟะพัะปะตะดะฝะธะน ack ะฝะต ะดะพัˆะตะป ะดะพ ะพั‚ะฟั€ะฐะฒะธั‚ะตะปั
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
}

เดชเดพเด•เตเด•เดฑเตเดฑเต เดฐเต€เดคเดฟ เด…เดฏเดฏเตเด•เตเด•เตเด•

เด•เดดเดฟเดตเตเดณเตเดณ เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต เดˆ เดฐเต€เดคเดฟ เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด†เดฆเตเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเดจเตเดฆเต‡เดถเดคเตเดคเดฟเดจเต เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด‚ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเต‡เดถเดตเตเด‚.
FirstPacketSending.SendPacket:

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
  connectionRecord.PacketCounter = 0;
  connectionRecord.SndNext = 0;
  connectionRecord.WindowLowerBound = 0;       
  // ะตัะปะธ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั - ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฒัะต ะฟะฐะบะตั‚ั‹
  // ะธ ะฒั‹ัะฒะพะฑะพะถะดะฐะตะผ ั€ะตััƒั€ัั‹
  if (connectionRecord.IsNoAnswerNeeded)
  {
    // ะ—ะดะตััŒ ะฟั€ะพะธัั…ะพะดะธั‚ ะพั‚ะฟั€ะฐะฒะบะฐ As Is
    do
    {
      ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, ReliableUdpStateTools. CreateReliableUdpHeader(connectionRecord)));
      connectionRecord.SndNext++;
    } while (connectionRecord.SndNext < connectionRecord.NumberOfPackets);
    SetAsCompleted(connectionRecord);
    return;
  }
  // ัะพะทะดะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตั‚ะฐ ะธ ะพั‚ะฟั€ะฐะฒะปัะตะผ ะตะณะพ 
  ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
  // ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
  connectionRecord.SndNext++;
  // ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ
  connectionRecord.WindowLowerBound++;
  connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
  // ะ—ะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€
  connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}

เด•เดดเดฟเดตเตเดณเตเดณ เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ, เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต.
SendingCycle.SendPacket:

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{      
  // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ      
  for (connectionRecord.PacketCounter = 0;
        connectionRecord.PacketCounter < connectionRecord.WindowSize &&
        connectionRecord.SndNext < connectionRecord.NumberOfPackets;
        connectionRecord.PacketCounter++)
  {
    ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
    connectionRecord.SndNext++;
  }
  // ะฝะฐ ัะปัƒั‡ะฐะน ะฑะพะปัŒัˆะพะณะพ ะพะบะฝะฐ ะฟะตั€ะตะดะฐั‡ะธ, ะฟะตั€ะตะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะฟะพัะปะต ะพั‚ะฟั€ะฐะฒะบะธ
  connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
  if ( connectionRecord.CloseWaitTimer != null )
  {
    connectionRecord.CloseWaitTimer.Change( -1, -1 );
  }
}

เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เด†เดดเดคเตเดคเดฟเตฝ. เด•เดฃเด•เตเดทเดจเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเตเด•เดณเตเด‚ เดธเตเดฑเตเดฑเต‡เดฑเตเดฑเตเด•เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเด•เดณเตเด‚ เด•เดฃเตเดŸเตเด•เดดเดฟเดžเตเดžเต, เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เด•เตเดฑเดšเตเดšเต เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เตพ เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเต‹เด•เตเด•เดพเด‚.
เดธเดพเดงเดพเดฐเดฃ เด…เดตเดธเตเดฅเดฏเดฟเตฝ เดกเดพเดฑเตเดฑเดพ เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดกเดฏเด—เตเดฐเด‚:.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

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

private void StartTransmission(ReliableUdpMessage reliableUdpMessage, EndPoint endPoint, AsyncResultSendMessage asyncResult)
{
  if (m_isListenerStarted == 0)
  {
    if (this.LocalEndpoint == null)
    {
      throw new ArgumentNullException( "", "You must use constructor with parameters or start listener before sending message" );
    }
    // ะทะฐะฟัƒัะบะฐะตะผ ะพะฑั€ะฐะฑะพั‚ะบัƒ ะฒั…ะพะดัั‰ะธั… ะฟะฐะบะตั‚ะพะฒ
    StartListener(LocalEndpoint);
  }
  // ัะพะทะดะฐะตะผ ะบะปัŽั‡ ะดะปั ัะปะพะฒะฐั€ั, ะฝะฐ ะพัะฝะพะฒะต EndPoint ะธ ReliableUdpHeader.TransmissionId        
  byte[] transmissionId = new byte[4];
  // ัะพะทะดะฐะตะผ ัะปัƒั‡ะฐะนะฝั‹ะน ะฝะพะผะตั€ transmissionId        
  m_randomCrypto.GetBytes(transmissionId);
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
  // ัะพะทะดะฐะตะผ ะฝะพะฒัƒัŽ ะทะฐะฟะธััŒ ะดะปั ัะพะตะดะธะฝะตะฝะธั ะธ ะฟั€ะพะฒะตั€ัะตะผ, 
  // ััƒั‰ะตัั‚ะฒัƒะตั‚ ะปะธ ัƒะถะต ั‚ะฐะบะพะน ะฝะพะผะตั€ ะฒ ะฝะฐัˆะธั… ัะปะพะฒะฐั€ัั…
  if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
  {
    // ะตัะปะธ ััƒั‰ะตัั‚ะฒัƒะตั‚ โ€“ ั‚ะพ ะฟะพะฒั‚ะพั€ะฝะพ ะณะตะฝะตั€ะธั€ัƒะตะผ ัะปัƒั‡ะฐะนะฝั‹ะน ะฝะพะผะตั€ 
    m_randomCrypto.GetBytes(transmissionId);
    key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
    if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
      // ะตัะปะธ ัะฝะพะฒะฐ ะฝะต ัƒะดะฐะปะพััŒ โ€“ ะณะตะฝะตั€ะธั€ัƒะตะผ ะธัะบะปัŽั‡ะตะฝะธะต
      throw new ArgumentException("Pair TransmissionId & EndPoint is already exists in the dictionary");
  }
  // ะทะฐะฟัƒัั‚ะธะปะธ ัะพัั‚ะพัะฝะธะต ะฒ ะพะฑั€ะฐะฑะพั‚ะบัƒ         
  m_listOfHandlers[key].State.SendPacket(m_listOfHandlers[key]);
}

เด†เดฆเตเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเต (เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจ เด…เดตเดธเตเดฅ):

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
  connectionRecord.PacketCounter = 0;
  connectionRecord.SndNext = 0;
  connectionRecord.WindowLowerBound = 0;       
  // ... 
  // ัะพะทะดะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตั‚ะฐ ะธ ะพั‚ะฟั€ะฐะฒะปัะตะผ ะตะณะพ 
  ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
  // ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
  connectionRecord.SndNext++;
  // ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ
  connectionRecord.WindowLowerBound++;
  // ะฟะตั€ะตั…ะพะดะธะผ ะฒ ัะพัั‚ะพัะฝะธะต SendingCycle
  connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
  // ะ—ะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€
  connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}

เด†เดฆเตเดฏเดคเตเดคเต† เดชเดพเด•เตเด•เดฑเตเดฑเต เด…เดฏเดšเตเดš เดถเต‡เดทเด‚, เด…เดฏเดšเตเดšเดฏเดพเตพ เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเต เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ - เดชเดพเด•เตเด•เต‡เดœเต เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด•.
เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดตเดถเด‚, EndReceive เดฐเต€เดคเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เด…เดฏเดšเตเดš เดชเดพเด•เตเด•เดฑเตเดฑเต เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดชเตเดคเดฟเดฏเดคเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต เด•เดฃเด•เตเดทเตป เดฑเต†เด•เตเด•เต‹เตผเดกเต เด•เต‚เดŸเดพเดคเต† เดˆ เดชเดพเด•เตเด•เดฑเตเดฑเต, เด’เดฐเต เดชเตเดฐเต€-เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดค เดคเดฒเด•เตเด•เต†เดŸเตเดŸเต‹เดŸเต†, เดธเด‚เดธเตโ€Œเด•เดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเตเดฑเต† เดฑเดฟเดธเต€เดตเต เดชเดพเด•เตเด•เดฑเตเดฑเต เดฐเต€เดคเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เด•เตˆเดฎเดพเดฑเตเดจเตเดจเต เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เดฒเดญเดฟเดšเตเดšเต
เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดญเดพเด—เดคเตเดคเต เด’เดฐเต เด•เดฃเด•เตเดทเตป เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต:

private void EndReceive(IAsyncResult ar)
{
  // ...
  // ะฟะฐะบะตั‚ ะฟะพะปัƒั‡ะตะฝ
  // ะฟะฐั€ัะธะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตั‚ะฐ        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // ะฟั€ะธัˆะตะป ะฝะตะบะพั€ั€ะตะบั‚ะฝั‹ะน ะฟะฐะบะตั‚ - ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะตะณะพ
    return;
  }
  // ะบะพะฝัั‚ั€ัƒะธั€ัƒะตะผ ะบะปัŽั‡ ะดะปั ะพะฟั€ะตะดะตะปะตะฝะธั connection recordโ€™ะฐ ะดะปั ะฟะฐะบะตั‚ะฐ
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // ะฟะพะปัƒั‡ะฐะตะผ ััƒั‰ะตัั‚ะฒัƒัŽั‰ัƒัŽ connection record ะธะปะธ ัะพะทะดะฐะตะผ ะฝะพะฒัƒัŽ
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header. ReliableUdpMessageType));
  // ะทะฐะฟัƒัะบะฐะตะผ ะฟะฐะบะตั‚ ะฒ ะพะฑั€ะฐะฑะพั‚ะบัƒ ะฒ ะบะพะฝะตั‡ะฝั‹ะน ะฐะฒั‚ะพะผะฐั‚
  record.State.ReceivePacket(record, header, bytes);
}

เด†เดฆเตเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเต เดธเตเดตเต€เด•เดฐเดฟเดšเตเดšเต เด’เดฐเต เด…เด‚เด—เต€เด•เดพเดฐเด‚ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต (เด†เดฆเตเดฏเดชเดพเด•เตเด•เดฑเตเดฑเต เดธเตเดตเต€เด•เดฐเดฟเดšเตเดš เด…เดตเดธเตเดฅ):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะฟะฐะบะตั‚
    return;
  // ...
  // by design ะฒัะต packet numbers ะฝะฐั‡ะธะฝะฐัŽั‚ัั ั 0;
  if (header.PacketNumber != 0)          
    return;
  // ะธะฝะธั†ะธะฐะปะธะทะธั€ัƒะตะผ ะผะฐััะธะฒ ะดะปั ั…ั€ะฐะฝะตะฝะธั ั‡ะฐัั‚ะตะน ัะพะพะฑั‰ะตะฝะธั
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะดะฐะฝะฝั‹ะต ะฟะฐะบะตั‚ ะฒ ะผะฐััะธะฒ
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ัั‡ะธั‚ะฐะตะผ ะบะพะป-ะฒะพ ะฟะฐะบะตั‚ะพะฒ, ะบะพั‚ะพั€ั‹ะต ะดะพะปะถะฝั‹ ะฟั€ะธะนั‚ะธ
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฝะพะผะตั€ ะฟะพัะปะตะดะฝะตะณะพ ะฟะพะปัƒั‡ะตะฝะฝะพะณะพ ะฟะฐะบะตั‚ะฐ (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // ะฟะพัะปะต ัะดะฒะธะฝัƒะปะธ ะพะบะฝะพ ะฟั€ะธะตะผะฐ ะฝะฐ 1
  connectionRecord.WindowLowerBound++;
  // ะฟะตั€ะตะบะปัŽั‡ะฐะตะผ ัะพัั‚ะพัะฝะธะต
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;  
  if (/*ะตัะปะธ ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั ะผะตั…ะฐะฝะธะทะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต*/)
  // ...
  else
  {
    // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด†เดดเดคเตเดคเดฟเตฝ. เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดฏเตเดกเดฟเดชเดฟเดฏเตเดŸเต† เด’เดฐเต เดชเตเดฐเดงเดพเดจ เดญเดพเด—เดฎเดพเดฃเต เดŸเตˆเด‚เด”เดŸเตเดŸเต เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตฝ. เด’เดฐเต เด‡เดจเตเดฑเตผเดฎเต€เดกเดฟเดฏเดฑเตเดฑเต เดจเต‹เดกเต เดชเดฐเดพเดœเดฏเดชเตเดชเต†เดŸเตเด•เดฏเตเด‚ เดฐเดฃเตเดŸเต เดฆเดฟเดถเด•เดณเดฟเดฒเตเดฎเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดกเต†เดฒเดฟเดตเดฑเดฟ เด…เดธเดพเดงเตเดฏเดฎเดพเดตเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดค เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดชเดฐเดฟเด—เดฃเดฟเด•เตเด•เตเด•.
เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ เด’เดฐเต เด•เดฃเด•เตเดทเตป เด…เดŸเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดกเดฏเด—เตเดฐเด‚:.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

เดกเดฏเด—เตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดคเต เดชเต‹เดฒเต†, เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด…เดฏเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚ เด…เดฏเดšเตเดšเดฏเดพเดณเตเดŸเต† เดตเตผเด•เตเด•เต เดŸเตˆเดฎเตผ เด‰เดŸเตป เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต. เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเตเดฑเต† SendPacket เดฐเต€เดคเดฟเดฏเดฟเดฒเดพเดฃเต เด‡เดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ.
เดตเตผเด•เตเด•เต เดŸเตˆเดฎเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเดจเตเดจเต (เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ เดจเดฟเดฒ):

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{      
  // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ   
  // ...   
  // ะฟะตั€ะตะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะฟะพัะปะต ะพั‚ะฟั€ะฐะฒะบะธ
  connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
  if ( connectionRecord.CloseWaitTimer != null )
    connectionRecord.CloseWaitTimer.Change( -1, -1 );
}

เด•เดฃเด•เตเดทเตป เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดŸเตˆเดฎเตผ เดชเดฟเดฐเต€เดกเตเด•เตพ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดกเดฟเดซเต‹เตพเดŸเตเดŸเต ShortTimerPeriod 5 เดธเต†เด•เตเด•เตปเดกเดพเดฃเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ, เด‡เดคเต 1,5 เดธเต†เด•เตเด•เตปเดกเดพเดฏเดฟ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด’เดฐเต เด‡เตปเด•เดฎเดฟเด‚เด—เต เด•เดฃเด•เตเดทเดจเดพเดฏเดฟ, เด…เดตเดธเดพเดจ เด‡เตปเด•เดฎเดฟเด‚เด—เต เดกเดพเดฑเตเดฑเดพ เดชเดพเด•เตเด•เดฑเตเดฑเต เดฒเดญเดฟเดšเตเดšเดคเดฟเดจเต เดถเต‡เดทเด‚ เดŸเตˆเดฎเตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต, เด‡เดคเต เดธเด‚เดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเตเดฑเต† เดฑเดฟเดธเต€เดตเตเดชเดพเด•เตเด•เดฑเตเดฑเต เดฐเต€เดคเดฟเดฏเดฟเดฒเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต. เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต
เดตเตผเด•เตเด•เต เดŸเตˆเดฎเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเดจเตเดจเต (เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เด…เดตเดธเตเดฅ):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ... 
  // ะฟะตั€ะตะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ั‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
}

เดตเตผเด•เตเด•เดฟเด‚เด—เต เดŸเตˆเดฎเดฑเดฟเดจเดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด‡เตปเด•เดฎเดฟเด‚เด—เต เด•เดฃเด•เตเดทเดจเดฟเตฝ เด•เต‚เดŸเตเดคเตฝ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดตเดจเตเดจเดฟเดฒเตเดฒ. เดŸเตˆเดฎเตผ เด“เดซเดพเด•เตเด•เดฟ ProcessPackets เดฐเต€เดคเดฟ เดตเดฟเดณเดฟเดšเตเดšเต, เด…เดตเดฟเดŸเต† เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดŸ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ, เดตเต€เดฃเตเดŸเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด†เดฆเตเดฏเดฎเดพเดฏเดฟ เด…เดฏเดšเตเดšเต.
เดตเต€เดฃเตเดŸเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต (เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เด…เดตเดธเตเดฅ):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  // ...        
  if (/*ะฟั€ะพะฒะตั€ะบะฐ ะฝะฐ ะฟะพั‚ะตั€ัะฝะฝั‹ะต ะฟะฐะบะตั‚ั‹ */)
  {
    // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะทะฐะฟั€ะพัั‹ ะฝะฐ ะฟะพะฒั‚ะพั€ะฝัƒัŽ ะดะพัั‚ะฐะฒะบัƒ
    // ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั‚ะฐะนะผะตั€ ะฒะพ ะฒั‚ะพั€ะพะน ั€ะฐะท, ะดะปั ะฟะพะฒั‚ะพั€ะฝะพะน ะฟะพะฟั‹ั‚ะบะธ ะฟะตั€ะตะดะฐั‡ะธ
    if (!connectionRecord.TimerSecondTry)
    {
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
    connectionRecord.TimerSecondTry = true;
    return;
    }
  // ะตัะปะธ ะฟะพัะปะต ะดะฒัƒั… ะฟะพะฟั‹ั‚ะพะบ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธะน WaitForPacketTimer 
  // ะฝะต ัƒะดะฐะปะพััŒ ะฟะพะปัƒั‡ะธั‚ัŒ ะฟะฐะบะตั‚ั‹ - ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะทะฐะฒะตั€ัˆะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
  StartCloseWaitTimer(connectionRecord);
  }
  else if (/*ะฟั€ะธัˆะตะป ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚ ะธ ัƒัะฟะตัˆะฝะฐั ะฟั€ะพะฒะตั€ะบะฐ */)
  {
    // ...
    StartCloseWaitTimer(connectionRecord);
  }
  // ะตัะปะธ ack ะฝะฐ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ ะฑั‹ะป ะฟะพั‚ะตั€ัะฝ
  else
  { 
    if (!connectionRecord.TimerSecondTry)
    {
      // ะฟะพะฒั‚ะพั€ะฝะพ ะพั‚ัั‹ะปะฐะตะผ ack
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะทะฐะฒะตั€ัˆะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
    StartCloseWaitTimer(connectionRecord);
  }
}

TimerSecondTry เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดฏเดฅเดพเตผเดฅ. เดชเตเดฐเดตเตผเดคเตเดคเดจ เดŸเตˆเดฎเตผ เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดˆ เดตเต‡เดฐเดฟเดฏเดฌเดฟเตพ เด‰เดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต.

เด…เดฏเดšเตเดšเดฏเดพเดณเตเดŸเต† เดญเดพเด—เดคเตเดคเต, เดชเตเดฐเดตเตผเดคเตเดคเดจ เดŸเตˆเดฎเดฑเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเด•เดฏเตเด‚ เด…เดตเดธเดพเดจเด‚ เด…เดฏเดšเตเดš เดชเดพเด•เตเด•เดฑเตเดฑเต เดตเต€เดฃเตเดŸเตเด‚ เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดŸเตˆเดฎเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเดจเตเดจเต (เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ เดจเดฟเดฒ):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  // ...        
  // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฟะพะฒั‚ะพั€ะฝะพ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚ 
  // ...        
  // ะฒะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€ CloseWait โ€“ ะดะปั ะพะถะธะดะฐะฝะธั ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ะธะปะธ ะตะณะพ ะทะฐะฒะตั€ัˆะตะฝะธั
  StartCloseWaitTimer(connectionRecord);
}

เด…เดคเดฟเดจเตเดถเต‡เดทเด‚, เด”เดŸเตเดŸเตเด—เต‹เดฏเดฟเด‚เด—เต เด•เดฃเด•เตเดทเดจเดฟเตฝ เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดŸเตˆเดฎเตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต.
ReliableUdpState.StartCloseWaitTimer:

protected void StartCloseWaitTimer(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
  else
    connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.LongTimerPeriod, -1);
}

เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดŸเตˆเดฎเตผ เดธเดฎเดฏเดชเดฐเดฟเดงเดฟ เดกเดฟเดซเต‹เตพเดŸเตเดŸเดพเดฏเดฟ 30 เดธเต†เด•เตเด•เตปเดกเดพเดฃเต.

เด•เตเดฑเดšเตเดšเต เดธเดฎเดฏเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เดธเตเดตเต€เด•เตผเดคเตเดคเดพเดตเดฟเดจเตเดฑเต† เดตเดถเดคเตเดคเตเดณเตเดณ เดตเตผเด•เตเด•เดฟเด‚เด—เต เดŸเตˆเดฎเตผ เดตเต€เดฃเตเดŸเตเด‚ เดซเดฏเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต, เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดตเต€เดฃเตเดŸเตเด‚ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเตเดถเต‡เดทเด‚ เด‡เตปเด•เดฎเดฟเด‚เด—เต เด•เดฃเด•เตเดทเดจเดพเดฏเดฟ เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดŸเตˆเดฎเตผ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต.

เด•เตเดฒเต‹เดธเต เดŸเตˆเดฎเดฑเตเด•เตพ เดซเดฏเตผ เดšเต†เดฏเตเดฏเตเดฎเตเดชเต‹เตพ, เดฐเดฃเตเดŸเต เด•เดฃเด•เตเดทเตป เดฑเต†เด•เตเด•เต‹เตผเดกเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดŽเดฒเตเดฒเดพ เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเตเด‚ เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดฏเตเด‚. เดกเต†เดฒเดฟเดตเดฑเดฟ เดชเดฐเดพเดœเดฏเด‚ เด…เดชเตโ€ŒเดธเตเดŸเตเดฐเต€เด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดšเตเดšเดฏเดพเตพ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต (เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP API เด•เดพเดฃเตเด•).
เด•เดฃเด•เตเดทเตป เดฑเต†เด•เตเด•เต‹เตผเดกเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดฑเดฟเดฒเต€เดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

public void Dispose()
{
  try
  {
    System.Threading.Monitor.Enter(this.LockerReceive);
  }
  finally
  {
    Interlocked.Increment(ref this.IsDone);
    if (WaitForPacketsTimer != null)
    {
      WaitForPacketsTimer.Dispose();
    }
    if (CloseWaitTimer != null)
    {
      CloseWaitTimer.Dispose();
    }
    byte[] stream;
    Tcb.IncomingStreams.TryRemove(Key, out stream);
    stream = null;
    Tcb.OutcomingStreams.TryRemove(Key, out stream);
    stream = null;
    System.Threading.Monitor.Exit(this.LockerReceive);
  }
}

เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เด†เดดเดคเตเดคเดฟเตฝ. เดกเดพเดฑเตเดฑ เด•เตˆเดฎเดพเดฑเตเดฑเด‚ เดชเตเดจเดƒเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดจเตเดจเต

เดชเดพเด•เตเด•เดฑเตเดฑเต เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดŸเดพเตฝ เดกเดพเดฑเตเดฑเดพ เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดตเต€เดฃเตเดŸเต†เดŸเตเด•เตเด•เตฝ เดกเดฏเด—เตเดฐเด‚:.Net-เดจเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ

เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ เด•เดฃเด•เตเดทเตป เด…เดŸเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เด‡เดคเดฟเดจเด•เด‚ เดšเตผเดšเตเดš เดšเต†เดฏเตเดคเดคเตเดชเต‹เดฒเต†, เดชเตเดฐเดตเตผเดคเตเดคเดจ เดŸเตˆเดฎเตผ เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ, เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดŸ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดฑเดฟเดธเต€เดตเตผ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด‚. เดชเดพเด•เตเด•เดฑเตเดฑเต เดจเดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเตเดŸเดพเตฝ, เดธเตเดตเต€เด•เตผเดคเตเดคเดพเดตเดฟเดจเต เดŽเดคเตเดคเดพเดคเตเดค เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเด‚. เดˆ เดจเดฎเตเดชเดฑเตเด•เตพ เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด•เดฃเด•เตเดทเดจเตเดฑเต† LostPackets เด…เดฑเต‡เดฏเดฟเตฝ เดจเตฝเด•เตเด•เดฏเตเด‚ เดตเต€เดฃเตเดŸเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
เดชเดพเด•เตเด•เต‡เดœเตเด•เตพ เดตเต€เดฃเตเดŸเตเด‚ เดกเต†เดฒเดฟเดตเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต (เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เด…เดตเดธเตเดฅ):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  //...
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // ะตัั‚ัŒ ะฟะพั‚ะตั€ัะฝะฝั‹ะต ะฟะฐะบะตั‚ั‹, ะพั‚ัั‹ะปะฐะตะผ ะทะฐะฟั€ะพัั‹ ะฝะฐ ะฝะธั…
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // ...
  }
}

เด…เดฏเดšเตเดšเดฏเดพเตพ เดตเต€เดฃเตเดŸเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดจเดทเตโ€ŒเดŸเดฎเดพเดฏ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚. เดˆ เดจเดฟเดฎเดฟเดทเดคเตเดคเดฟเตฝ, เด…เดฏเดšเตเดšเดฏเดพเตพ เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เด•เดฃเด•เตเดทเตป เด•เตเดฒเต‹เดธเต เดŸเตˆเดฎเตผ เด†เดฐเด‚เดญเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เดจเตเดจเตเด‚ เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดฒเดญเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดคเต เดชเตเดจเดƒเดธเดœเตเดœเดฎเดพเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเตเด‚ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต.
เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดŸ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดตเต€เดฃเตเดŸเตเด‚ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเต (เด…เดฏเด•เตเด•เตเดจเตเดจ เดธเตˆเด•เตเด•เดฟเตพ เดจเดฟเดฒ):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  // ัะฑั€ะพั ั‚ะฐะนะผะตั€ะฐ ะทะฐะบั€ั‹ั‚ะธั ัะพะตะดะธะฝะตะฝะธั 
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // ัั‚ะพ ะทะฐะฟั€ะพั ะฝะฐ ะฟะพะฒั‚ะพั€ะฝัƒัŽ ะฟะตั€ะตะดะฐั‡ัƒ โ€“ ะพั‚ะฟั€ะฐะฒะปัะตะผ ั‚ั€ะตะฑัƒะตะผั‹ะน ะฟะฐะบะตั‚          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

เดฑเต€เดธเต†เดจเตเดฑเต เดชเดพเด•เตเด•เดฑเตเดฑเต (เดกเดฏเด—เตเดฐเดพเดฎเดฟเดฒเต† เดชเดพเด•เตเด•เดฑเตเดฑเต #3) เด‡เตปเด•เดฎเดฟเด‚เด—เต เด•เดฃเด•เตเดทเดจเดฟเดฒเต‚เดŸเต† เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต. เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดœเดพเดฒเด•เด‚ เดจเดฟเดฑเดžเตเดžเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเตเด‚ เดธเดพเดงเดพเดฐเดฃ เดกเดพเดฑเตเดฑเดพ เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดชเตเดจเดƒเดธเตเดฅเดพเดชเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เด’เดฐเต เดชเดฐเดฟเดถเต‹เดงเดจ เดจเดŸเดคเตเดคเตเดจเตเดจเต.
เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเตปเดกเต‹เดฏเดฟเดฒเต† เดนเดฟเดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต (เด…เดธเด‚เดฌเตเดฒเดฟเด‚เด—เต เด…เดตเดธเตเดฅ):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  // ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ ะฟะฐะบะตั‚ะพะฒ        
  connectionRecord.PacketCounter++;
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฒ ะผะฐััะธะฒ ัƒะฟั€ะฐะฒะปะตะฝะธั ะพะบะฝะพะผ ั‚ะตะบัƒั‰ะธะน ะฝะพะผะตั€ ะฟะฐะบะตั‚ะฐ        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐะธะฑะพะปัŒัˆะธะน ะฟั€ะธัˆะตะดัˆะธะน ะฟะฐะบะตั‚        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // ะฟะตั€ะตะทะฐะฟัƒัะบะฐะผ ั‚ะฐะนะผะตั€ั‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // ะตัะปะธ ะฝะฐะผ ะฟั€ะธัˆะปะธ ะฒัะต ะฟะฐะบะตั‚ั‹ ะพะบะฝะฐ, ั‚ะพ ัะฑั€ะฐัั‹ะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
  // ะธ ะฒั‹ัั‹ะปะฐะตะผ ะฟะฐะบะตั‚ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // ัะฑั€ะฐัั‹ะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ.      
    connectionRecord.PacketCounter = 0;
    // ัะดะฒะธะฝัƒะปะธ ะพะบะฝะพ ะฟะตั€ะตะดะฐั‡ะธ
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ะพะฑะฝัƒะปะตะฝะธะต ะผะฐััะธะฒะฐ ัƒะฟั€ะฐะฒะปะตะฝะธั ะฟะตั€ะตะดะฐั‡ะตะน
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // ...
}

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP API

เดกเดพเดฑเตเดฑเดพ เดŸเตเดฐเดพเตปเดธเตเดซเตผ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเตเดฎเดพเดฏเดฟ เดธเด‚เดตเดฆเดฟเด•เตเด•เดพเตป, เด’เดฐเต เดคเตเดฑเดจเตเดจ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ Udp เด•เตเดฒเดพเดธเต เด‰เดฃเตเดŸเต, เด…เดคเต เดŸเตเดฐเดพเตปเดธเตเดซเตผ เด•เตบเดŸเตเดฐเต‹เตพ เดฌเตเดฒเต‹เด•เตเด•เดฟเดจเต เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เด’เดฐเต เดฑเดพเดชเตเดชเดฑเดพเดฃเต. เด•เตเดฒเดพเดธเดฟเดฒเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดงเดพเดจเดชเตเดชเต†เดŸเตเดŸ เด…เด‚เด—เด™เตเด™เตพ เด‡เดคเดพ:

public sealed class ReliableUdp : IDisposable
{
  // ะฟะพะปัƒั‡ะฐะตั‚ ะปะพะบะฐะปัŒะฝัƒัŽ ะบะพะฝะตั‡ะฝัƒัŽ ั‚ะพั‡ะบัƒ
  public IPEndPoint LocalEndpoint    
  // ัะพะทะดะฐะตั‚ ัะบะทะตะผะฟะปัั€ ReliableUdp ะธ ะทะฐะฟัƒัะบะฐะตั‚
  // ะฟั€ะพัะปัƒัˆะธะฒะฐะฝะธะต ะฒั…ะพะดัั‰ะธั… ะฟะฐะบะตั‚ะพะฒ ะฝะฐ ัƒะบะฐะทะฐะฝะฝะพะผ IP ะฐะดั€ะตัะต
  // ะธ ะฟะพั€ั‚ัƒ. ะ—ะฝะฐั‡ะตะฝะธะต 0 ะดะปั ะฟะพั€ั‚ะฐ ะพะทะฝะฐั‡ะฐะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต
  // ะดะธะฝะฐะผะธั‡ะตัะบะธ ะฒั‹ะดะตะปะตะฝะฝะพะณะพ ะฟะพั€ั‚ะฐ
  public ReliableUdp(IPAddress localAddress, int port = 0) 
  // ะฟะพะดะฟะธัะบะฐ ะฝะฐ ะฟะพะปัƒั‡ะตะฝะธะต ะฒั…ะพะดัั‰ะธั… ัะพะพะฑั‰ะตะฝะธะน
  public ReliableUdpSubscribeObject SubscribeOnMessages(ReliableUdpMessageCallback callback, ReliableUdpMessageTypes messageType = ReliableUdpMessageTypes.Any, IPEndPoint ipEndPoint = null)    
  // ะพั‚ะฟะธัะบะฐ ะพั‚ ะฟะพะปัƒั‡ะตะฝะธั ัะพะพะฑั‰ะตะฝะธะน
  public void Unsubscribe(ReliableUdpSubscribeObject subscribeObject)
  // ะฐัะธะฝั…ั€ะพะฝะฝะพ ะพั‚ะฟั€ะฐะฒะธั‚ัŒ ัะพะพะฑั‰ะตะฝะธะต 
  // ะŸั€ะธะผะตั‡ะฐะฝะธะต: ัะพะฒะผะตัั‚ะธะผะพัั‚ัŒ ั XP ะธ Server 2003 ะฝะต ั‚ะตั€ัะตั‚ัั, ั‚.ะบ. ะธัะฟะพะปัŒะทัƒะตั‚ัั .NET Framework 4.0
  public Task<bool> SendMessageAsync(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, CancellationToken cToken)
  // ะฝะฐั‡ะฐั‚ัŒ ะฐัะธะฝั…ั€ะพะฝะฝัƒัŽ ะพั‚ะฟั€ะฐะฒะบัƒ ัะพะพะฑั‰ะตะฝะธั
  public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)
  // ะฟะพะปัƒั‡ะธั‚ัŒ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฐัะธะฝั…ั€ะพะฝะฝะพะน ะพั‚ะฟั€ะฐะฒะบะธ
  public bool EndSendMessage(IAsyncResult asyncResult)  
  // ะพั‡ะธัั‚ะธั‚ัŒ ั€ะตััƒั€ัั‹
  public void Dispose()    
}

เดธเดฌเตเดธเตเด•เตเดฐเดฟเดชเตเดทเตป เดตเดดเดฟเดฏเดพเดฃเต เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเดคเต. เด•เต‹เตพเดฌเดพเด•เตเด•เต เดฐเต€เดคเดฟเดฏเตเดŸเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเดฟ เด’เดชเตเดชเต:

public delegate void ReliableUdpMessageCallback( ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteClient );

เดธเดจเตเดฆเต‡เดถเด‚:

public class ReliableUdpMessage
{
  // ั‚ะธะฟ ัะพะพะฑั‰ะตะฝะธั, ะฟั€ะพัั‚ะพะต ะฟะตั€ะตั‡ะธัะปะตะฝะธะต
  public ReliableUdpMessageTypes Type { get; private set; }
  // ะดะฐะฝะฝั‹ะต ัะพะพะฑั‰ะตะฝะธั
  public byte[] Body { get; private set; }
  // ะตัะปะธ ัƒัั‚ะฐะฝะพะฒะปะตะฝะพ ะฒ true โ€“ ะผะตั…ะฐะฝะธะทะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั ะดะพัั‚ะฐะฒะบะธ ะฑัƒะดะตั‚ ะพั‚ะบะปัŽั‡ะตะฝ
  // ะดะปั ะฟะตั€ะตะดะฐั‡ะธ ะบะพะฝะบั€ะตั‚ะฝะพะณะพ ัะพะพะฑั‰ะตะฝะธั
  public bool NoAsk { get; private set; }
}

เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เดธเดจเตเดฆเต‡เดถ เดคเดฐเดคเตเดคเดฟเดฒเต‡เด•เตเด•เตเด‚/เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เด…เดฏเดšเตเดšเดฏเดพเดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เดธเดฌเตโ€Œเดธเตโ€Œเด•เตเดฐเตˆเดฌเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดฐเดฃเตเดŸเต เด“เดชเตโ€Œเดทเดฃเตฝ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต: ReliableUdpMessageTypes messageType, IPEndPoint ipEndPoint.

เดธเดจเตเดฆเต‡เดถ เดคเดฐเด™เตเด™เตพ:

public enum ReliableUdpMessageTypes : short
{ 
  // ะ›ัŽะฑะพะต
  Any = 0,
  // ะ—ะฐะฟั€ะพั ะบ STUN server 
  StunRequest = 1,
  // ะžั‚ะฒะตั‚ ะพั‚ STUN server
  StunResponse = 2,
  // ะŸะตั€ะตะดะฐั‡ะฐ ั„ะฐะนะปะฐ
  FileTransfer =3,
  // ...
}

เดธเดจเตเดฆเต‡เดถเด‚ เด…เดธเดฎเดจเตเดตเดฟเดคเดฎเดพเดฏเดฟ เด…เดฏเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต; เด‡เดคเดฟเดจเดพเดฏเดฟ, เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เด’เดฐเต เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดฎเต‹เดกเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต:

public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)

เด’เดฐเต เดธเดจเตเดฆเต‡เดถเด‚ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดซเดฒเด‚ เดถเดฐเดฟเดฏเดพเด•เตเด‚ - เดธเดจเตเดฆเต‡เดถเด‚ เดธเตเดตเต€เด•เตผเดคเตเดคเดพเดตเดฟเตฝ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏเดฟ เดŽเดคเตเดคเดฟเดฏเดพเตฝ เดคเต†เดฑเตเดฑเตเด‚ - เด•เดพเดฒเดนเดฐเดฃเดชเตเดชเต†เดŸเตเดŸเต เด•เดฃเด•เตเดทเตป เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดšเตเดšเต†เด™เตเด•เดฟเตฝ:

public bool EndSendMessage(IAsyncResult asyncResult)

เดคเต€เดฐเตเดฎเดพเดจเด‚

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดชเดฒเดคเตเด‚ เดตเดฟเดตเดฐเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. เดคเตเดฐเต†เดกเต เดฎเดพเดšเตเดšเดฟเด‚เด—เต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เตพ, เด’เดดเดฟเดตเดพเด•เตเด•เดฒเตเด‚ เดชเดฟเดถเด•เต เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดฒเตเด‚, เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดธเดจเตเดฆเต‡เดถเดฎเดฏเดฏเตเด•เตเด•เตฝ เดฐเต€เดคเดฟเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ. เดŽเดจเตเดจเดพเตฝ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เด•เดพเดคเตฝ, เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด’เดฐเต เด•เดฃเด•เตเดทเตป เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดธเดฎเดฏเดชเดฐเดฟเดงเดฟเด•เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดฏเตเด•เตเดคเดฟเดฏเตเดŸเต† เดตเดฟเดตเดฐเดฃเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚.

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดกเต†เดฒเดฟเดตเดฑเดฟ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเดšเตเดš เดชเดคเดฟเดชเตเดชเต เดฎเตเดฎเตเดชเต เดจเดฟเตผเดตเดšเดฟเดšเตเดš เด†เดตเดถเตเดฏเด•เดคเด•เตพ เดจเดฟเดฑเดตเต‡เดฑเตเดฑเดพเตป เดชเดฐเตเดฏเดพเดชเตเดคเดตเตเด‚ เดตเดดเด•เตเด•เดฎเตเดณเตเดณเดคเตเดฎเดพเดฃเต. เดŽเดจเตเดจเดพเตฝ เดตเดฟเดตเดฐเดฟเดšเตเดš เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เด•เดดเดฟเดฏเตเดฎเต†เดจเตเดจเต เดžเดพเตป เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดคเตเดฐเต‚เดชเตเดŸเตเดŸเต เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดŸเตˆเดฎเตผ เด•เดพเดฒเดฏเดณเดตเตเด•เตพ เดšเดฒเดจเดพเดคเตเดฎเด•เดฎเดพเดฏเดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเด‚, เดธเตเดฒเตˆเดกเดฟเด‚เด—เต เดตเดฟเตปเดกเต‹, RTT เดชเต‹เดฒเตเดณเตเดณ เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เตพ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด•เดฃเด•เตเดทเตป เดจเต‹เดกเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเตฝ MTU เดจเดฟเตผเดฃเตเดฃเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดธเด‚เดตเดฟเดงเดพเดจเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเดจเตเด‚ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเด‚ (เดชเด•เตเดทเต‡ เดตเดฒเดฟเดฏ เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เด…เดฏเดšเตเดšเดพเตฝ เดฎเดพเดคเตเดฐเด‚) .

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดงเดฏเตเด•เตเด•เต เดจเดจเตเดฆเดฟ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเตเด‚ เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเตเด‚ เดžเดพเตป เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต.

PS เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเตฝ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดตเตผเด•เตเด•เต, GitHube-เดฒเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดฒเดฟเด™เตเด•เต:
เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ UDP เดชเดฆเตเดงเดคเดฟ

เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เดฒเดฟเด™เตเด•เตเด•เดณเตเด‚ เดฒเต‡เด–เดจเด™เตเด™เดณเตเด‚

  1. TCP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดธเตเดชเต†เดธเดฟเดซเดฟเด•เตเด•เต‡เดทเตป: เด‡เด‚เด—เตเดฒเดฟเดทเดฟเดฒเต ะธ เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเตฝ
  2. UDP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ เดธเตเดชเต†เดธเดฟเดซเดฟเด•เตเด•เต‡เดทเตป: เด‡เด‚เด—เตเดฒเดฟเดทเดฟเดฒเต ะธ เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเตฝ
  3. RUDP เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เดณเดฟเดจเตเดฑเต† เดšเตผเดšเตเดš: draft-ietf-sigtran-reliable-udp-00
  4. เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดกเดพเดฑเตเดฑ เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ: เด†เตผเดŽเดซเตเดธเดฟ 908 ะธ เด†เตผเดŽเดซเตเดธเดฟ 1151
  5. เดฏเตเดกเดฟเดชเดฟ เดตเดดเดฟเดฏเตเดณเตเดณ เดกเต†เดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เดฒเดณเดฟเดคเดฎเดพเดฏ เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ: .NET, UDP เดŽเดจเตเดจเดฟเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเด‚เด—เดฟเดจเตเดฑเต† เดชเต‚เตผเดฃเตเดฃ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด‚ เดเดฑเตเดฑเต†เดŸเตเด•เตเด•เตเด•
  6. NAT เดŸเตเดฐเดพเดตเต‡เดดเตเดธเตฝ เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด™เตเด™เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจ เดฒเต‡เด–เดจเด‚: เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดตเดฟเดฒเดพเดธเด‚ เดตเดฟเดตเตผเดคเตเดคเด•เดฐเดฟเดฒเตเดŸเดจเต€เดณเด‚ เดชเดฟเดฏเตผ-เดŸเต-เดชเดฟเดฏเตผ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚
  7. เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดฎเต‹เดกเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตฝ: CLR เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดฎเต‹เดกเตฝ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต ะธ IAsyncResult เดกเดฟเดธเตˆเตป เดชเดพเดฑเตเดฑเต‡เตบ เดŽเด™เตเด™เดจเต† เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเด‚
  8. เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดฎเต‹เดกเตฝ เดŸเดพเดธเตโ€Œเด•เต เด…เดงเดฟเดทเตโ€Œเด เดฟเดค เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดชเดพเดฑเตเดฑเต‡เดฃเดฟเดฒเต‡เด•เตเด•เต (TAP-เดฒเต† APM) เดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต:
    TPL เด‰เด‚ เดชเดฐเดฎเตเดชเดฐเดพเด—เดค .NET เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เตเด‚
    เดฎเดฑเตเดฑเต เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดชเดพเดฑเตเดฑเต‡เดฃเตเด•เดณเตเด‚ เดคเดฐเด™เตเด™เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‡เดŸเดชเต†เดŸเตเด•

เด…เดชเตเดกเต‡เดฑเตเดฑเต: เดจเดจเตเดฆเดฟ เดฎเต‡เดฏเดฑเต‹เดตเตเดชเดฟ ะธ เดธเดฟเดฆเตเดฐเดฟเดธเตเดฑเตเดฑเดฟเดœเต เด‡เดจเตเดฑเตผเดซเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดŸเดพเดธเตเด•เต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด†เดถเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ. เดชเดดเดฏ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเตเดฎเดพเดฏเตเดณเตเดณ เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเตเดŸเต† เด…เดจเตเดฏเต‹เดœเตเดฏเดค เดฒเด‚เด˜เดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ เดจเดพเดฒเดพเดฎเดคเตเดคเต† เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต XP, 4 เดธเต†เตผเดตเตผ เดŽเดจเตเดจเดฟเดตเดฏเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต.

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

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