เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เป„เบ”เป‰เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰. เบซเบ™เบถเปˆเบ‡เปƒเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ” - UDP เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบเบฒเบ™เบญเบญเบเบญเบฒเบเบฒเบ”, เปเบ•เปˆเบเบฑเบ‡เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ "peer-to-peer" เบฅเบฐเบซเบงเปˆเบฒเบ‡ nodes เป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบญเบญเบเปเบšเบšเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ‚เบญเบ‡เบกเบฑเบ™, เป‚เบ›เป‚เบ•เบ„เบญเบ™เบ™เบตเป‰เบกเบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบงเบฒเบ‡เปเบœเบ™เป„เบงเป‰เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เปเบ™เบงเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™, เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เบ‚เบฒเบ”เบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™, เบšเปเปˆเป„เบ”เป‰เบซเบฒเบเป„เบ›เบ—เบธเบเบšเปˆเบญเบ™. เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เบญเบฐโ€‹เบ—เบดโ€‹เบšเบฒเบโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบชเบฑเบ™โ€‹เบเบฒโ€‹เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบชเบปเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบฎเบฑเบšโ€‹เบ›เบฐโ€‹เบเบฑเบ™โ€‹เบœเปˆเบฒเบ™ UDPโ€‹.
เป€เบ™เบทเป‰เบญเบซเบฒ:เป€เบ‚เบปเป‰เบฒ
เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบžเบดเบ—เบตเบเบฒเบ™
เบชเปˆเบงเบ™เบซเบปเบง UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰
เบซเบผเบฑเบเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ
เปเบปเบ”เป€เบงเบฅเบฒ เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเป‚เบ›เบฃเป‚เบ•เบ„เป
เปเบœเบ™เบงเบฒเบ”เบชเบฐเบ–เบฒเบ™เบฐเบชเบฒเบเบชเบปเปˆเบ‡ UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰
เป€เบฅเบดเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบซเบฑเบ”. เบซเบ™เปˆเบงเบโ€‹เบ„เบงเบšโ€‹เบ„เบธเบกโ€‹เบชเบฒเบโ€‹เบชเบปเปˆเบ‡โ€‹
เป€เบฅเบดเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบซเบฑเบ”. เบฅเบฑเบ”

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

เป€เบ‚เบปเป‰เบฒ

เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เป„เบ”เป‰เบชเบปเบกเบกเบธเบ”เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเบ”เบฝเบงเบเบฑเบ™เป€เบŠเบดเปˆเบ‡เปเบ•เปˆเบฅเบฐ node เบกเบตเบ—เบตเปˆเบขเบนเปˆ IP เบ—เบปเปˆเบงเป‚เบฅเบเปเบฅเบฐเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเปเบฅเบฐเบชเบฒเบกเบฒเบ”เบชเบทเปˆเบชเบฒเบ™เป‚เบ”เบเบเบปเบ‡เบเบฑเบš nodes เบญเบทเปˆเบ™เป†. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบกเบตเบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ - เบžเบทเป‰เบ™เบ—เบตเปˆเบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบ—เบตเปˆเบขเบนเปˆ IP เบ—เบปเปˆเบงเป‚เบฅเบเปเบฅเบฐเบซเบผเบฒเบเบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบกเบตเบ—เบตเปˆเบขเบนเปˆเบชเปˆเบงเบ™เบ•เบปเบงเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เบขเบนเปˆเบซเบฅเบฑเบ‡เบญเบธเบ›เบฐเบเบญเบ™ NAT.เปƒเบ™เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ™เบตเป‰, เบžเบฝเบ‡เปเบ•เปˆเบญเบธเบ›เบฐเบเบญเบ™เบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเบ—เบปเปˆเบงเป‚เบฅเบเบชเบฒเบกเบฒเบ”เบ•เบดเบ”เบ•เปเปˆเบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบ—เบธเบเบ„เบปเบ™เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบกเบตเบ—เบตเปˆเบขเบนเปˆ IP เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ, เบ—เบปเปˆเบงเป‚เบฅเบ. node เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบชเปˆเบงเบ™เบ•เบปเบงเบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš nodes เบญเบทเปˆเบ™เป†เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ”เบฝเบงเบเบฑเบ™, เปเบฅเบฐเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš nodes เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡เบญเบทเปˆเบ™เป†เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเบ—เบปเปˆเบงเป‚เบฅเบ. เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบฅเบธเป„เบ”เป‰เบชเปˆเบงเบ™เปƒเบซเบเปˆเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบปเบ™เป„เบเบเบฒเบ™เปเบ›เบ—เบตเปˆเบขเบนเปˆเป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เบญเบธเบ›เบฐเบเบญเบ™ NAT, เป€เบŠเบฑเปˆเบ™ Wi-Fi routers, เบชเป‰เบฒเบ‡เบฅเบฒเบเบเบฒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบเบฒเบ™เปเบ›เบžเบฒเบชเบฒเบžเบดเป€เบชเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเบญเบญเบเปเบฅเบฐเปเบเป‰เป„เบ‚เบ—เบตเปˆเบขเบนเปˆ IP เปเบฅเบฐเบ•เบปเบงเป€เบฅเบเบžเบญเบ”เปƒเบ™เปเบžเบฑเบเป€เบเบฑเบ”. เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเบญเบญเบเบˆเบฒเบเป€เบ„เบทเบญเบ‚เปˆเบฒเบเป€เบญเบเบฐเบŠเบปเบ™เป„เบ›เบซเบฒเป€เบˆเบปเป‰เบฒเบžเบฒเบšเปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเบ—เบปเปˆเบงเป‚เบฅเบ. เปเบ•เปˆเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบญเบธเบ›เบฐเบเบญเบ™ NAT เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบˆเบฐเบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เบ‚เบฒเป€เบ‚เบปเป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบงเบฑเป‰เบ™เป€เบชเบเปเบ•เปˆเบเบปเบ”เบฅเบฐเบšเบฝเบšเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒ.

เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒเบ‚เบญเบ‡เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบ–เบทเบเบ•เป‰เบญเบ‡เบžเบฝเบ‡เบžเปเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบšเปˆเบญเบ™เบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เบขเบนเปˆเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเบชเปˆเบงเบ™เบ•เบปเบง, เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบกเบตเบ—เบตเปˆเบขเบนเปˆเบ—เบปเปˆเบงเป‚เบฅเบ. เปเบ•เปˆเบกเบฑเบ™เบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบปเบ‡เบ‚เบญเบ‡เบชเบญเบ‡ nodes เบฅเบฐเบซเบงเปˆเบฒเบ‡ เบ•เปˆเบฒเบ‡ เป€เบ„เบทเบญโ€‹เบ‚เปˆเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹เบ•เบปเบงโ€‹. เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบปเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบญเบ‡ nodes เปเบกเปˆเบ™เบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ peer-to-peer เป€เบŠเบฑเปˆเบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบชเบฝเบ‡ (Skype), เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบˆเบฒเบเป„เบฅเบเบฐเป„เบ (TeamViewer), เบซเบผเบทเป€เบเบกเบญเบญเบ™เป„เบฅเบ™เปŒ.

เบซเบ™เบถเปˆเบ‡เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ peer-to-peer เบฅเบฐเบซเบงเปˆเบฒเบ‡เบญเบธเบ›เบฐเบเบญเบ™เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเป€เบญเบเบฐเบŠเบปเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เปเบกเปˆเบ™เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบเบฒเบ™เป€เบˆเบฒเบฐเบฎเบน. เป€เบ•เบฑเบเบ™เบดเบเบ™เบตเป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเป‚เบ›เป‚เบ•เบ„เบญเบ™ UDP.

เปเบ•เปˆเบ–เป‰เบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เป‚เบญเบ™เป„เบŸเบฅเปŒเบฅเบฐเบซเบงเปˆเบฒเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบต, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ UDP เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบเบญเบฑเบ™เป€เบ™เบทเปˆเบญเบ‡เบกเบฒเบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒ UDP เบšเปเปˆเปเบกเปˆเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ—เบตเปˆเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เปเบฅเบฐเบšเปเปˆเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”, เบšเปเปˆเบ„เบทเบเบฑเบš TCP. เบžเบดเบ—เบตเบเบฒเบ™.

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

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

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

เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบžเบดเบ—เบตเบเบฒเบ™

  1. เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบชเบปเปˆเบ‡โ€‹เบŠเบญเบ‡โ€‹เบ—เบตเปˆโ€‹เป€เบŠเบทเปˆเบญโ€‹เบ–เบทโ€‹เป„เบ”เป‰โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เป‚เบ”เบโ€‹เบœเปˆเบฒเบ™โ€‹เบเบปเบ™โ€‹เป„เบโ€‹เบ„เปเบฒโ€‹เบ„เบถเบ”โ€‹เบ„เปเบฒโ€‹เป€เบซเบฑเบ™โ€‹เปƒเบ™โ€‹เบ—เบฒเบ‡โ€‹เบšเบงเบ (เบญเบฑเบ™โ€‹เบ—เบตเปˆโ€‹เป€เบญเบตเป‰เบ™โ€‹เบงเปˆเบฒโ€‹เบเบฒเบ™โ€‹เบฎเบฑเบšโ€‹เบฎเบนเป‰โ€‹เปƒเบ™โ€‹เบ—เบฒเบ‡โ€‹เบšเบงเบโ€‹)
  2. เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เปƒเบซเบเปˆเบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, i.e. เป‚เบ›เป‚เบ•เบ„เบญเบ™เบ•เป‰เบญเบ‡เบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ•เปเปˆเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™
  3. เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบเบปเบเป€เบฅเบตเบเบเบปเบ™เป„เบเบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡ (เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเป€เบ›เบฑเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™ UDP "เบšเปเบฅเบดเบชเบธเบ”").
  4. เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฎเบนเบšเปเบšเบšเบ„เปเบฒเบชเบฑเปˆเบ‡, เบ”เป‰เบงเบเบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบก
  5. เบซเบปเบงเปœเปˆเบงเบเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบœเปˆเบฒเบ™เป‚เบ›เบฃเป‚เบ•เบ„เปเบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบก

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

เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เป€เบงเบฅเบฒเบ‚เบญเบ‡เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบญเบ‡เป‚เบซเบ™เบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบเป‚เบ”เบเปƒเบŠเป‰เป‚เบ›เป‚เบ•เบ„เบญเบ™ TCP เปเบฅเบฐ UDP. เปƒเบซเป‰เปƒเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบเปเบฅเบฐเบ™เบต, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบนเบ™เป€เบชเบเบŠเบญเบ‡เบซเบ™เบถเปˆเบ‡.
เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบœเปˆเบฒเบ™ TCP:เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเปเบœเบ™เบงเบฒเบ”, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”, TCP เบˆเบฐเบเบงเบ”เบžเบปเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบชเบนเบ™เป€เบชเบเปเบฅเบฐเบฅเบฒเบเบ‡เบฒเบ™เปƒเบซเป‰เบœเบนเป‰เบชเบปเปˆเบ‡เป‚เบ”เบเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบกเบตเบˆเปเบฒเบ™เบงเบ™เบชเปˆเบงเบ™เบ—เบตเปˆเบชเบนเบ™เป€เบชเบ.
เบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบœเปˆเบฒเบ™ UDP Protocol:เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

UDP เบšเปเปˆเป„เบ”เป‰เบ”เปเบฒเป€เบ™เบตเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบเบฒเบ™เบชเบนเบ™เป€เบชเบเปƒเบ”เป†. เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบชเบฒเบเบชเบปเปˆเบ‡เปƒเบ™เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ UDP เปเบกเปˆเบ™เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™.

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

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” (i. e. เบชเบปเปˆเบ‡เบซเบผเบฒเบเบเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เบชเปˆเบงเบ™เป‚เบ”เบเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบญเบกเบฎเบฑเบš), เป‚เบ›เป‚เบ•เบ„เบญเบ™ TCP เปƒเบŠเป‰เบญเบฑเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบชเบปเปˆเบ‡ - เบˆเปเบฒเบ™เบงเบ™ bytes เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบœเบนเป‰เบชเบปเปˆเบ‡เบ‚เบญเบ‡ segment เบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบš.

เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบš TCP protocol, เป€เบšเบดเปˆเบ‡ rfc793, เบˆเบฒเบ UDP เบเบฑเบš rfc768เบšเปˆเบญเบ™เบ—เบตเปˆ, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบ–เบทเบเบเปเบฒเบ™เบปเบ”.

เบˆเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบซเบผเบฒเบเบเบงเปˆเบฒ UDP (เบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒ. UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰), เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ™เป„เบเบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบš TCP. เบ„เบท:

  • เบšเบฑเบ™เบ—เบถเบเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ
  • เปƒเบŠเป‰เป€เบฅเบเบชเปˆเบงเบ™
  • เปƒเบŠเป‰เบŠเบธเบ”เบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบžเบดเป€เบชเบ”
  • เปƒเบŠเป‰เบเบปเบ™เป„เบ windowing เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบเป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เป‚เบ›เบฃเป‚เบ•เบ„เป

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™:

  • เบชเบฑเบ™เบเบฒเบ™เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก, เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบชเบฑเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ
  • เบชเบปเปˆเบ‡เบชเบฑเบ™เบเบฒเบ™เบเบฒเบ™เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก, เป€เบžเบทเปˆเบญเบ–เปˆเบฒเบเบ—เบญเบ”เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเป„เบ›เบซเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบ—เบดเบ‡เบ™เป‰เปเบฒเปเบฅเบฐเบ›เปˆเบญเบเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เป‚เบ›เบฃเป‚เบ•เบ„เป
  • เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เปƒเบซเป‰โ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹เบชเบฐโ€‹เป€เบžเบฒเบฐโ€‹เป€เบžเบทเปˆเบญโ€‹เบ›เบดเบ”โ€‹เบเบฒเบ™โ€‹เปƒเบŠเป‰โ€‹เบ‡เบฒเบ™โ€‹เบเบปเบ™โ€‹เป„เบโ€‹เบเบฒเบ™โ€‹เบขเบฑเป‰เบ‡โ€‹เบขเบทเบ™โ€‹เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เบชเบปเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เป€เบ›เบฑเบ™ "เบšเปโ€‹เบฅเบดโ€‹เบชเบธเบ”โ€‹" UDP

เบชเปˆเบงเบ™เบซเบปเบง UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒ UDP datagram เปเบกเปˆเบ™ encapsulated เปƒเบ™ IP datagram. เปเบžเบฑเบเป€เบเบฑเบ” UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เปเบกเปˆเบ™ "เบซเปเปˆ" เบขเปˆเบฒเบ‡เป€เบซเบกเบฒเบฐเบชเบปเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ UDP datagram.
เบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆเบซเบปเบง UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰:เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบซเบปเบง UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ:

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

  • เบ—เบธเบ‡ - package control flags
  • MessageType - เบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบ—เบดเบ‡เบเบฐเปเบชเป€เบžเบทเปˆเบญเบชเบฐเปเบฑเบเบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบฐเป€เบžเบฒเบฐ
  • TransmissionId - เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบชเบปเปˆเบ‡โ€‹, เบฎเปˆเบงเบกโ€‹เบเบฑเบšโ€‹เบ—เบตเปˆโ€‹เบขเบนเปˆโ€‹เปเบฅเบฐโ€‹เบžเบญเบ”โ€‹เบ‚เบญเบ‡โ€‹เบœเบนเป‰โ€‹เบฎเบฑเบšโ€‹, เป€เบ›เบฑเบ™โ€‹เป€เบญโ€‹เบเบฐโ€‹เบฅเบฑเบโ€‹เบฅเบฐโ€‹เบšเบธโ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹.
  • PacketNumber - เป€เบฅเบเปเบžเบฑเบเป€เบเบฑเบ”
  • เบ•เบปเบงเป€เบฅเบทเบญเบ - เบ•เบปเบงเป€เบฅเบทเบญเบเป‚เบ›เบฃเป‚เบ•เบ„เปเป€เบžเบตเปˆเบกเป€เบ•เบตเบก. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”, เบกเบฑเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบŠเบตเป‰เบšเบญเบเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก

เบ—เบธเบ‡โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹:

  • FirstPacket - เบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก
  • NoAsk - เบ‚เปเป‰เบ„เบงเบฒเบกเบšเปเปˆเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบปเบ™เป„เบเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เปƒเบŠเป‰เบ‡เบฒเบ™
  • LastPacket - เบŠเบธเบ”เบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก
  • RequestForPacket - เบŠเบธเบ”โ€‹เบเบฒเบ™โ€‹เบขเบฑเป‰เบ‡โ€‹เบขเบทเบ™โ€‹เบซเบผเบทโ€‹เบเบฒเบ™โ€‹เบฎเป‰เบญเบ‡โ€‹เบ‚เปโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบนเบ™โ€‹เป€เบชเบโ€‹เบŠเบญเบ‡โ€‹

เบซเบผเบฑเบเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ

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

เบเบปเบ™เป„เบเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปเบกเปˆเบ™เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบขเบธเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ. เบ—เบธเบ‡ LastPacket เบ–เบทเบเบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เปเบžเบฑเบเป€เบเบฑเบ”เบชเบธเบ”เบ—เป‰เบฒเบเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก. เปƒเบ™เบŠเบญเบ‡เบ•เบญเบšเบฎเบฑเบš, เบ•เบปเบงเป€เบฅเบเบ‚เบญเบ‡เบŠเบญเบ‡เบชเบธเบ”เบ—เป‰เบฒเบ + 1 เปเบกเปˆเบ™เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบ”เป‰เบฒเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”.
เปเบœเบ™โ€‹เบงเบฒเบ”โ€‹เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เบ•เบฑเป‰เบ‡โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบชเบดเป‰เบ™โ€‹เบชเบธเบ”โ€‹เบเบฒเบ™โ€‹เป€เบŠเบทเปˆเบญเบกโ€‹เบ•เปเปˆโ€‹:เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

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

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

เปเบปเบ”เป€เบงเบฅเบฒ เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเป‚เบ›เบฃเป‚เบ•เบ„เป

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

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

เปเบœเบ™เบงเบฒเบ”เบชเบฐเบ–เบฒเบ™เบฐเบชเบฒเบเบชเบปเปˆเบ‡ UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบซเบผเบฑเบเบเบฒเบ™เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบฅเบฑเบ”เบ—เบตเปˆเบˆเปเบฒเบเบฑเบ”, เปเบ•เปˆเบฅเบฐเบฅเบฑเบ”เบ—เบตเปˆเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ•เปเปˆเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”.
เปเบœเบ™เบงเบฒเบ”เบฅเบฑเบ” UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰:

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

เบ›เบดเบ” - เบšเปเปˆเปเบกเปˆเบ™เบฅเบฑเบ”เปเบ—เป‰เป†, เบกเบฑเบ™เป€เบ›เบฑเบ™เบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปเบฅเบฐเบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เบ‚เบญเบ‡ automaton. เบชเปเบฒเบฅเบฑเบšเบฅเบฑเบ” เบ›เบดเบ” เบ•เบฑเบ™เบ„เบงเบšเบ„เบธเบกเบฅเบฐเบšเบปเบšเบชเบฒเบเบชเบปเปˆเบ‡เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบš, เป€เบŠเบดเปˆเบ‡, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ UDP asynchronous, เบชเบปเปˆเบ‡เบ•เปเปˆเปเบžเบฑเบเป€เบเบฑเบ”เป„เบ›เบซเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเปเบฅเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ‚เบญเบ‡เบฅเบฑเบ”.

FirstPacketSending โ€“ เบชเบฐเบ–เบฒเบ™เบฐเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบ—เบตเปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเบญเบญเบเปเบกเปˆเบ™เป€เบกเบทเปˆเบญเบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเบชเบปเปˆเบ‡.

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

เบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เบชเบปเปˆเบ‡ โ€“ เบžเบทเป‰เบ™โ€‹เบ–เบฒเบ™โ€‹เบชเบฐโ€‹เบ–เบฒโ€‹เบ™เบฐโ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบชเบปเปˆเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบŠเบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบ„เบงเบฒเบกโ€‹.

เบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เป„เบ›เบˆเบฒเบเบฅเบฑเบ” FirstPacketSending เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป„เบ”เป‰เบ–เบทเบเบชเบปเปˆเบ‡. เบกเบฑเบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบ™เบตเป‰เบงเปˆเบฒเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เปเบฅเบฐเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบš retransmissions เบกเบฒ. เบเบฒเบ™เบญเบญเบเบˆเบฒเบเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เปƒเบ™เบชเบญเบ‡เบเปเบฅเบฐเบ™เบต - เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบซเบผเบทเป€เบงเบฅเบฒเบซเบกเบปเบ”เป€เบงเบฅเบฒ.

FirstPacket เป„เบ”เป‰เบฎเบฑเบš - เบชเบฐเบ–เบฒเบ™เบฐเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบชเบณเบฅเบฑเบšเบœเบนเป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบก.

เบกเบฑเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบปเปˆเบ‡เบ•เปเปˆ, เบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, เปเบฅเบฐเบชเบปเปˆเบ‡เบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบเบฒเบ™เบฎเบฑเบšเบ‚เบญเบ‡เบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”.

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

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ - เบฅเบฑเบ”โ€‹เบžเบทเป‰เบ™โ€‹เบ–เบฒเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบŠเบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบ„เบงเบฒเบกโ€‹.

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

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

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

เป€เบฅเบดเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบซเบฑเบ”. เบซเบ™เปˆเบงเบโ€‹เบ„เบงเบšโ€‹เบ„เบธเบกโ€‹เบชเบฒเบโ€‹เบชเบปเปˆเบ‡โ€‹

เบซเบ™เบถเปˆเบ‡เปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡ UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เปเบกเปˆเบ™เบ•เบฑเบ™เบ„เบงเบšเบ„เบธเบกเบฅเบฐเบšเบปเบšเบชเบฒเบเบชเบปเปˆเบ‡. เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบ•เบฑเบ™เบ™เบตเป‰เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบŠเปˆเบงเบ, เปเบˆเบเบขเบฒเบเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเปƒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™, เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เป„เบ›เบซเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ” API เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™. เบšเบฅเบฑเบญเบเบ„เบงเบšเบ„เบธเบกเบฅเบฐเบšเบปเบšเบชเบฒเบเบชเบปเปˆเบ‡เป„เบ”เป‰เบฎเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบˆเบฒเบเบŠเบฑเป‰เบ™ UDP เปเบฅเบฐเบชเบปเปˆเบ‡เบ•เปเปˆเป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบฅเบฑเบ”เป€เบžเบทเปˆเบญเบ›เบฐเบกเบงเบ™เบœเบปเบ™. เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”, เบกเบฑเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ UDP เปเบšเบš asynchronous.
เบชเบฐเบกเบฒเบŠเบดเบเบšเบฒเบ‡เบ„เบปเบ™เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™ 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;    	
  //...
}

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ UDP asynchronous:

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;
  //...
}

เป€เบฅเบดเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบซเบฑเบ”. เบฅเบฑเบ”

เบฅเบฑเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบ‚เบญเบ‡เบฅเบฑเบ”เบ‚เบญเบ‡เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰, เบšเปˆเบญเบ™เบ—เบตเปˆเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบซเป‰เบญเบ‡เบฎเบฝเบ™ abstract ReliableUdpState เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบชเปเบฒเบฅเบฑเบšเบฅเบฑเบ”:

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

เป€เบซเบ”เบœเบปเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบŠเบฑเป‰เบ™เบฎเบฝเบ™เบ—เบตเปˆเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบžเป‰เบญเบกเบเบฑเบšเบŠเบฑเป‰เบ™เบŠเปˆเบงเบเบ—เบตเปˆเบชเบฐเบซเบ™เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบชเบฐเบ–เบดเบ”, เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เบชเป‰เบฒเบ‡เบชเปˆเบงเบ™เบซเบปเบง 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();
}

เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆ overridden เปƒเบ™เบฅเบฑเบ” เบชเปเบฒเป€เบฅเบฑเบ”.
เบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง.DisposeByTimeout:

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

ProcessPackets เบงเบดเบ—เบตเบเบฒเบ™

เบงเบดเบ—เบตเบเบฒเบ™ ProcessPackets เปเบกเปˆเบ™เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ‚เบญเบ‡เบŠเบธเบ”เบซเบผเบทเบŠเบธเบ”. เป‚เบ—เบซเบฒเป‚เบ”เบเบเบปเบ‡เบซเบผเบทเบœเปˆเบฒเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเบฅเปเบ–เป‰เบฒเปเบžเบฑเบเป€เบเบฑเบ”.

เบชเบฒเบกเบฒเบ” เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ เบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™ overridden เปเบฅเบฐเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเปƒเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบŠเบธเบ”เบ—เบตเปˆเบชเบนเบ™เป€เบชเบเปเบฅเบฐเบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เป„เบ›เบชเบนเปˆเบฅเบฑเบ” เบชเปเบฒเป€เบฅเบฑเบ”, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบŠเบญเบ‡เบชเบธเบ”เบ—เป‰เบฒเบเปเบฅเบฐเบœเปˆเบฒเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”
Assembling.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);
}

เบชเบฒเบกเบฒเบ” เบชเปเบฒเป€เบฅเบฑเบ” เบงเบดเบ—เบตเบเบฒเบ™เบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เบˆเบฑเบšเป€เบงเบฅเบฒเปเบฅเปˆเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป„เบ›เบซเบฒเบœเบนเป‰เบˆเบญเบ‡.
เบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง.ProcessPackets:

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

เบงเบดเบ—เบตเบเบฒเบ™เบฎเบฑเบš Packet

เบชเบฒเบกเบฒเบ” FirstPacket เป„เบ”เป‰เบฎเบฑเบš เบงเบฝเบเบ‡เบฒเบ™เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบŠเบธเบ”เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เปเบฒเบญเบดเบ”เบกเบฒเบฎเบญเบ”เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš, เปเบฅเบฐเบเบฑเบ‡เป€เบเบฑเบšเบเปเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบŠเบญเบ‡เบ”เบฝเบง.
FirstPacketReceived.ReceivePacket:

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);
  }
}

เบชเบฒเบกเบฒเบ” เบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เบชเบปเปˆเบ‡ เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™ overridden เป€เบžเบทเปˆเบญเบเบญเบกเบฎเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เปเบฅเบฐเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป retransmission.
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));
}

เบชเบฒเบกเบฒเบ” เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡ เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™ ReceivePacket, เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบเบญเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฒเบเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบกเบฒเปเบกเปˆเบ™เป€เบเบตเบ”เบ‚เบทเป‰เบ™.
Assembling.ReceivePacket:

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);
  }
}

เบชเบฒเบกเบฒเบ” เบชเปเบฒเป€เบฅเบฑเบ” เบงเบฝเบเบ‡เบฒเบ™เบ”เบฝเบงเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบ„เบทเบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก.
เบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง.ReceivePacket:

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

เบชเบปเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆ

เบชเบฒเบกเบฒเบ” FirstPacketSending เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”, เบซเบผเบทเบ–เป‰เบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡, เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”.
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 );
  }
}

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

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

เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเบฒเบ™เบชเป‰เบฒเบ‡ เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเบชเบปเปˆเบ‡เบŠเบธเบ”เบ—เปเบฒเบญเบดเบ”. เบเบฒเบ™เป‚เบญเบ™เบเป‰เบฒเบเปเบกเปˆเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป‚เบ”เบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™ API เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก. เบ•เปเปˆเป„เบ›, เบงเบดเบ—เบตเบเบฒเบ™ StartTransmission เบ‚เบญเบ‡เบ•เบฑเบ™เบ„เบงเบšเบ„เบธเบกเบฅเบฐเบšเบปเบšเบชเบฒเบเบชเบปเปˆเบ‡เปเบกเปˆเบ™ invoked, เป€เบŠเบดเปˆเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบซเบกเปˆ.
เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเบญเบญเบ:

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]);
}

เบเบฒเบ™เบชเบปเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ—เปเบฒเบญเบดเบ” (FirstPacketSending state):

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, เบฎเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบชเบปเปˆเบ‡, เบชเป‰เบฒเบ‡เปƒเบซเบกเปˆ เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ เปเบฅเบฐเบชเบปเปˆเบ‡เบ•เปเปˆเปเบžเบฑเบเป€เบเบฑเบ”เบ™เบตเป‰, เป‚เบ”เบเบกเบตเบชเปˆเบงเบ™เบซเบปเบงเบ—เบตเปˆเปเบเบเบเปˆเบญเบ™, เป„เบ›เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เบฎเบฑเบšเปเบžเบฑเบเป€เบเบฑเบ”เบ‚เบญเบ‡เบฅเบฑเบ”เบชเบณเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™. FirstPacket เป„เบ”เป‰เบฎเบฑเบš
เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบขเบนเปˆเบ”เป‰เบฒเบ™เบเบฒเบ™เบฎเบฑเบš:

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);
}

เบเบฒเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบŠเบญเบ‡โ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบชเบปเปˆเบ‡โ€‹เบเบฒเบ™โ€‹เบฎเบฑเบšโ€‹เบฎเบนเป‰ (FirstPacketReceived เบฅเบฑเบ”โ€‹)โ€‹:

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);
  }
}

เป€เบฅเบดเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบซเบฑเบ”. เบเบฒเบ™เบ›เบดเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™เป€เบงเบฅเบฒเบซเบกเบปเบ”เป€เบงเบฅเบฒ

เบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เป€เบงเบฅเบฒเบซเบกเบปเบ”เป€เบงเบฅเบฒเปเบกเปˆเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡ UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰. เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเป‚เบซเบ™เบ”เบเบฒเบ‡เบฅเบปเป‰เบกเป€เบซเบฅเบงเปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบ—เบดเบ”เบ—เบฒเบ‡เบเบฒเบเป€เบ›เบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰.
เปเบœเบ™เบœเบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบดเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบฒเบ™เบซเบกเบปเบ”เป€เบงเบฅเบฒ:เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเปเบœเบ™เบงเบฒเบ”, เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบšเป€เบงเบฅเบฒเป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบœเบนเป‰เบชเบปเปˆเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบชเบปเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”. เบ™เบตเป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™ SendPacket เบ‚เบญเบ‡เบฅเบฑเบ” เบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เบชเบปเปˆเบ‡.
เป€เบ›เบตเบ”โ€‹เปƒเบŠเป‰โ€‹เบ‡เบฒเบ™โ€‹เป‚เบกเบ‡โ€‹เบˆเบฑเบšโ€‹เป€เบงโ€‹เบฅเบฒโ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบ (SendingCycle state):

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 เบงเบดเบ™เบฒเบ—เบต.

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

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);
  }
}

เป€เบฅเบดเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฐเบซเบฑเบ”. เบเบฒเบ™เบŸเบทเป‰เบ™เบŸเบนเบเบฒเบ™เป‚เบญเบ™เบ‚เปเป‰เบกเบนเบ™

เปเบœเบ™โ€‹เบงเบฒเบ”โ€‹เบเบฒเบ™โ€‹เบŸเบทเป‰เบ™โ€‹เบŸเบนโ€‹เบเบฒเบ™โ€‹เบชเบปเปˆเบ‡โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบชเบนเบ™โ€‹เป€เบชเบ packetโ€‹:เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒ Udp เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบš .Net

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบชเบปเบ™เบ—เบฐเบ™เบฒเปเบฅเป‰เบงเปƒเบ™เบเบฒเบ™เบ›เบดเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™เป€เบงเบฅเบฒเบซเบกเบปเบ”เป€เบงเบฅเบฒ, เป€เบกเบทเปˆเบญเป€เบงเบฅเบฒเป€เบฎเบฑเบ”เบงเบฝเบเบซเบกเบปเบ”เป€เบงเบฅเบฒ, เบœเบนเป‰เบฎเบฑเบšเบˆเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เปเบžเบฑเบเป€เบเบฑเบ”เบ—เบตเปˆเบชเบนเบ™เป€เบชเบ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบชเบนเบ™เป€เบชเบเปเบžเบฑเบเป€เบเบฑเบ”, เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบŠเบญเบ‡เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เป„เบ›เบซเบฒเบœเบนเป‰เบฎเบฑเบšเบˆเบฐเบ–เบทเบเบฅเบงเบšเบฅเบงเบก. เบ•เบปเบงเป€เบฅเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบญเบฒเป€เบฃ 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 เปƒเบ™เปเบœเบ™เบงเบฒเบ”) เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบฒเป€เบ‚เบปเป‰เบฒ. เบเบฒเบ™เบเบงเบ”เบชเบญเบšเปเบกเปˆเบ™เป€เบฎเบฑเบ”เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบฎเบฑเบšเปเบกเปˆเบ™เป€เบ•เบฑเบกเปเบฅเบฐเบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ›เบปเบเบเบฐเบ•เบดเบ–เบทเบเบŸเบทเป‰เบ™เบŸเบน.
เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบเบฒเบ™ hits เปƒเบ™โ€‹เบ›เปˆเบญเบ‡โ€‹เบขเป‰เบฝเบกโ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบš (เบชเบฐโ€‹เบ–เบฒโ€‹เบ™เบฐโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹)โ€‹:

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 Reliable เป€เบ›เบตเบ”, เป€เบŠเบดเปˆเบ‡เปเบกเปˆเบ™ wrapper เป€เบ—เบดเบ‡เบ•เบปเบงเบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป‚เบญเบ™เบเป‰เบฒเบ. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฐเบกเบฒเบŠเบดเบเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™:

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,
  // ...
}

เบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเบชเบปเปˆเบ‡เปเบšเบš asynchronous; เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰, เป‚เบ›เป‚เบ•เบ„เบญเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก asynchronous:

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

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบˆเบฐเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡ - เบ–เป‰เบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบกเบฒเบฎเบญเบ”เบœเบนเป‰เบฎเบฑเบšเบขเปˆเบฒเบ‡เบชเปเบฒเป€เบฅเบฑเบ”เบœเบปเบ™เปเบฅเบฐเบœเบดเบ” - เบ–เป‰เบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ–เบทเบเบ›เบดเบ”เปƒเบ™เป€เบงเบฅเบฒเบซเบกเบปเบ”เป€เบงเบฅเบฒ:

public bool EndSendMessage(IAsyncResult asyncResult)

เบชเบฐเบซเบฅเบธเบš

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

เบชเบฐเบšเบฑเบšเบ—เบตเปˆเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เปเบกเปˆเบ™เปเบ‚เบ‡เปเบฎเบ‡เปเบฅเบฐเบกเบตเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰. เปเบ•เปˆเบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เป„เบ”เป‰. เบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบžเบทเปˆเบญเป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เปเบฅเบฐเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบฅเบเบฐเป€เบงเบฅเบฒ timer, เบเบปเบ™เป„เบเป€เบŠเบฑเปˆเบ™: เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเป€เบฅเบทเปˆเบญเบ™เปเบฅเบฐ RTT เบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™, เบกเบฑเบ™เบเบฑเบ‡เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ™เป„เบเบเบฒเบ™เบเปเบฒเบ™เบปเบ” MTU เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ (เปเบ•เปˆเบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ–เบทเบเบชเบปเปˆเบ‡) .

เบ‚เปโ€‹เบ‚เบญเบšโ€‹เปƒเบˆโ€‹เบ—เปˆเบฒเบ™โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบญเบปเบฒโ€‹เปƒเบˆโ€‹เปƒเบชเปˆโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹, เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบซเบงเบฑเบ‡โ€‹เบงเปˆเบฒโ€‹เบˆเบฐโ€‹เบ„เปเบฒโ€‹เป€เบซเบฑเบ™โ€‹เปเบฅเบฐโ€‹เบ„เปเบฒโ€‹เป€เบซเบฑเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹.

PS เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบซเบผเบทเบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ—เบปเบ”เบชเบญเบšเป‚เบ›เป‚เบ•เบ„เบญเบ™, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™ GitHube:
เป‚เบ„เบ‡เบเบฒเบ™ UDP เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰

เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปเบฅเบฐเบšเบปเบ”เบ„เบงเบฒเบก

  1. เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™ TCP: เปƒเบ™เบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ” ะธ เปƒเบ™เบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบ
  2. เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™ UDP: เปƒเบ™เบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ” ะธ เปƒเบ™เบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบ
  3. เบเบฒเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเบžเบดเบ—เบตเบเบฒเบ™ RUDP: draft-ietf-sigtran-reliable-udp-00
  4. เบญเบฐเบ™เบธเบชเบฑเบ™เบเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰: rfc908 ะธ rfc1151
  5. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เปˆเบฒเบเบ”เบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบขเบทเบ™เบขเบฑเบ™เบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบœเปˆเบฒเบ™ UDP: เบ„เบงเบšเบ„เบธเบกเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบ—เบฑเบ‡เปเบปเบ”เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบ”เป‰เบงเบ .NET เปเบฅเบฐ UDP
  6. เบšเบปเบ”เบ„เบงเบฒเบกเบญเบฐเบ—เบดเบšเบฒเบเบเบปเบ™เป„เบเบเบฒเบ™เบ‚เป‰เบฒเบกเบœเปˆเบฒเบ™ NAT: เบเบฒเบ™โ€‹เบชเบทเปˆโ€‹เบชเบฒเบ™ Peer-to-Peer เบ—เบปเปˆเบงโ€‹เป€เบ„เบทเบญโ€‹เบ‚เปˆเบฒเบโ€‹เบœเบนเป‰โ€‹เปเบ›โ€‹เบ—เบตเปˆโ€‹เบขเบนเปˆโ€‹
  7. เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก asynchronous: เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเปเบšเบšเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก Asynchronous CLR ะธ เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบญเบญเบเปเบšเบš IAsyncResult
  8. เบเบฒเบ™ Porting the asynchronous programming model to the task-based asynchronous pattern (APM in TAP):
    TPL เปเบฅเบฐเปเบšเบšเบ”เบฑเป‰เบ‡เป€เบ”เบตเบก .NET Asynchronous Programming
    Interop เบเบฑเบšเบฎเบนเบšเปเบšเบš Asynchronous เปเบฅเบฐเบ›เบฐเป€เบžเบ”เบญเบทเปˆเบ™เป†

เบญเบฑเบšเป€เบ”เบ”: เบ‚เบญเบšเปƒเบˆ Mayorovp ะธ เบŠเบดเบ”เบชเบฐเบ•เบต เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบงเบฝเบเบ‡เบฒเบ™เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš. เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบเบฑเบšเบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบเบปเปˆเบฒเปเบกเปˆเบ™เบšเปเปˆเบ–เบทเบเบฅเบฐเป€เบกเบตเบ”, เป€เบžเบฒเบฐเบงเปˆเบฒ เบ‚เบญเบšเบงเบฝเบเบ—เบต 4 เบฎเบญเบ‡เบฎเบฑเบšเบ—เบฑเบ‡เป€เบŠเบตเบšเป€เบงเบต XP เปเบฅเบฐ 2003.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™