แƒกแƒแƒœแƒ“แƒ Udp แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ .Net-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜ แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒ. แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜ - UDP แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ“แƒแƒขแƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ›แƒแƒฃแƒฌแƒงแƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก "แƒ—แƒแƒœแƒฎแƒ›แƒแƒ‘แƒแƒ›แƒ“แƒ”" แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒกแƒแƒงแƒแƒคแƒแƒ“. แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ“แƒ˜แƒ–แƒแƒ˜แƒœแƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒแƒ› แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒก แƒแƒฅแƒ•แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒแƒ“แƒ แƒ” แƒ“แƒแƒฃแƒ’แƒ”แƒ’แƒ›แƒแƒ•แƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒ—แƒฃแƒ›แƒชแƒ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒœแƒแƒ™แƒšแƒแƒ•แƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ, แƒแƒ แƒกแƒแƒ“ แƒ’แƒแƒ›แƒฅแƒ แƒแƒšแƒ. แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒแƒฆแƒฌแƒ”แƒ แƒก แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒแƒก UDP-แƒ–แƒ”.
แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜:Entry
แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜
แƒกแƒแƒœแƒ“แƒ UDP แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜
แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ”แƒ‘แƒ˜
แƒ•แƒแƒ“แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜
แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ UDP แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒ
แƒฃแƒคแƒ แƒ แƒฆแƒ แƒ›แƒแƒ“ แƒจแƒ”แƒ•แƒ˜แƒ“แƒ แƒ™แƒแƒ“แƒ˜. แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜แƒก แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ
แƒฃแƒคแƒ แƒ แƒฆแƒ แƒ›แƒแƒ“ แƒจแƒ”แƒ•แƒ˜แƒ“แƒ แƒ™แƒแƒ“แƒ˜. แƒจแƒขแƒแƒขแƒ”แƒ‘แƒ˜

แƒฃแƒคแƒ แƒ แƒฆแƒ แƒ›แƒแƒ“ แƒจแƒ”แƒ•แƒ˜แƒ“แƒ แƒ™แƒแƒ“แƒ˜. แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ“แƒ แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ
แƒฃแƒคแƒ แƒ แƒฆแƒ แƒ›แƒแƒ“ แƒจแƒ”แƒ•แƒ˜แƒ“แƒ แƒ™แƒแƒ“แƒ˜. แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ แƒ“แƒ แƒแƒ˜แƒก แƒแƒ›แƒแƒฌแƒฃแƒ แƒ•แƒ˜แƒกแƒแƒก
แƒฃแƒคแƒ แƒ แƒฆแƒ แƒ›แƒแƒ“ แƒจแƒ”แƒ•แƒ˜แƒ“แƒ แƒ™แƒแƒ“แƒ˜. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ
แƒกแƒแƒœแƒ“แƒ UDP API
แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ
แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒ˜

Entry

แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒก แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ แƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ‘แƒ“แƒ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—แƒ’แƒ•แƒแƒ แƒแƒ•แƒแƒœ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒก, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒ™แƒ•แƒแƒœแƒซแƒก แƒฐแƒฅแƒแƒœแƒ“แƒ แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒ˜ แƒ“แƒ แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒ˜ IP แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜ แƒ“แƒ แƒจแƒ”แƒ”แƒซแƒšแƒ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ“แƒแƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒก แƒกแƒฎแƒ•แƒ แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก. แƒแƒฎแƒšแƒ แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒก, แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒแƒฅแƒ•แƒก แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ - แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒ˜ IP แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—แƒ˜ แƒแƒ แƒ” แƒ“แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒฃแƒ‘แƒแƒœแƒ˜, แƒกแƒแƒ“แƒแƒช แƒžแƒ˜แƒ แƒแƒ“แƒ˜ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜ แƒ˜แƒ›แƒแƒšแƒ”แƒ‘แƒ NAT แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ›แƒ.แƒแƒ› แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒแƒจแƒ˜, แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ  แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒแƒ— แƒแƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒ“แƒแƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒœแƒ”แƒœ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒก แƒฅแƒกแƒ”แƒšแƒจแƒ˜, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ›แƒแƒ— แƒแƒฅแƒ•แƒ— แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒ˜, แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒแƒ“ แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ แƒ”แƒ‘แƒแƒ“แƒ˜ IP แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜. แƒ™แƒ”แƒ แƒซแƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ“แƒแƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒก แƒ˜แƒ›แƒแƒ•แƒ” แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒก แƒกแƒฎแƒ•แƒ แƒชแƒœแƒแƒ‘แƒ˜แƒš แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜. แƒ”แƒก แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“ แƒ›แƒ˜แƒ˜แƒฆแƒฌแƒ”แƒ•แƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜แƒก แƒ—แƒแƒ แƒ’แƒ›แƒœแƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜แƒก แƒฌแƒงแƒแƒšแƒแƒ‘แƒ˜แƒ—. NAT แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ Wi-Fi แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜, แƒฅแƒ›แƒœแƒ˜แƒแƒœ แƒ—แƒแƒ แƒ’แƒ›แƒแƒœแƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒฃแƒ  แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒก แƒ’แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒชแƒ•แƒšแƒ˜แƒแƒœ IP แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒก แƒ“แƒ แƒžแƒแƒ แƒขแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ›แƒ แƒ”แƒ‘แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒจแƒ˜. แƒ”แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ˜แƒซแƒšแƒ”แƒ•แƒ แƒ’แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜ แƒ™แƒ”แƒ แƒซแƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒ“แƒแƒœ แƒฐแƒแƒกแƒขแƒ”แƒ‘แƒ—แƒแƒœ แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒแƒ•แƒ” แƒ“แƒ แƒแƒก, NAT แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, แƒ‘แƒšแƒแƒ™แƒแƒ•แƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒš แƒขแƒ แƒแƒคแƒ˜แƒ™แƒก, แƒ—แƒฃ แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒชแƒแƒšแƒ™แƒ”แƒฃแƒšแƒ˜ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ“แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜.

แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒก แƒ”แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒแƒ“ แƒกแƒฌแƒแƒ แƒ˜แƒ แƒ™แƒšแƒ˜แƒ”แƒœแƒข-แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒกแƒแƒ“แƒแƒช แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒ•แƒœแƒ”แƒœ แƒ™แƒ”แƒ แƒซแƒ แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒจแƒ˜, แƒฎแƒแƒšแƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒก แƒแƒฅแƒ•แƒ— แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒฅแƒ›แƒœแƒ˜แƒก แƒกแƒ˜แƒ แƒ—แƒฃแƒšแƒ”แƒ”แƒ‘แƒก แƒแƒ แƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒก แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ™แƒ”แƒ แƒซแƒ แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒ˜. แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒแƒ  แƒ™แƒ•แƒแƒœแƒซแƒก แƒจแƒแƒ แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ peer-to-peer แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒฎแƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ (Skype), แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒ–แƒ” แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒแƒžแƒแƒ•แƒ”แƒ‘แƒ (TeamViewer) แƒแƒœ แƒแƒœแƒšแƒแƒ˜แƒœ แƒ—แƒแƒ›แƒแƒจแƒ”แƒ‘แƒ˜.

แƒ”แƒ แƒ—-แƒ”แƒ แƒ— แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ  แƒ›แƒ”แƒ—แƒแƒ“แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ™แƒ”แƒ แƒซแƒ แƒฅแƒกแƒ”แƒšแƒจแƒ˜ แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒš แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก แƒ—แƒแƒœแƒแƒขแƒแƒšแƒ”แƒ‘แƒ—แƒแƒœ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—, แƒฎแƒ•แƒ แƒ”แƒšแƒ˜แƒก แƒ“แƒแƒ แƒขแƒงแƒ›แƒ แƒ”แƒฌแƒแƒ“แƒ”แƒ‘แƒ. แƒ”แƒก แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ UDP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒš แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ—แƒแƒœ.

แƒ›แƒแƒ’แƒ แƒแƒ› แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก แƒกแƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒ“แƒแƒ แƒ˜แƒชแƒฎแƒแƒ•แƒ— แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒก แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก, แƒ›แƒแƒจแƒ˜แƒœ UDP-แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒก แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒกแƒ˜แƒ แƒ—แƒฃแƒšแƒ” แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ แƒแƒ› UDP แƒแƒ  แƒแƒ แƒ˜แƒก แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜ แƒ“แƒ แƒแƒ  แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒแƒก แƒฌแƒ”แƒกแƒ แƒ˜แƒ’แƒจแƒ˜, แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ˜แƒ— TCP-แƒ˜แƒกแƒ’แƒแƒœ. แƒแƒฅแƒ›แƒ˜.

แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒกแƒแƒงแƒแƒคแƒแƒ“, แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒคแƒ”แƒœแƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒš แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒแƒก แƒ“แƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก UDP-แƒ–แƒ”.

แƒ›แƒกแƒฃแƒ แƒก แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒ, แƒ แƒแƒ› แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก TCP แƒฎแƒ•แƒ แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ™แƒ”แƒ แƒซแƒ แƒฅแƒกแƒ”แƒšแƒจแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก TCP แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒšแƒแƒ“, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ NAT แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒก แƒแƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ, แƒ”แƒก แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒแƒ  แƒ’แƒแƒœแƒ˜แƒฎแƒ˜แƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ’แƒ–แƒ. แƒแƒกแƒ”แƒ—แƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒ˜.

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒ“แƒแƒ แƒฉแƒ”แƒœแƒ˜แƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒ” แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒแƒ–แƒ” แƒ’แƒแƒ•แƒแƒ›แƒแƒฎแƒ•แƒ˜แƒšแƒ”แƒ‘ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก. UDP แƒฎแƒ•แƒ แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒขแƒ”แƒฅแƒœแƒ˜แƒ™แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒจแƒ˜.

แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜

  1. แƒกแƒแƒœแƒ“แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒแƒ“แƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ’แƒแƒ›แƒแƒฎแƒ›แƒแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜แƒ— (แƒ”.แƒฌ. แƒžแƒแƒ–แƒ˜แƒขแƒ˜แƒฃแƒ แƒ˜ แƒแƒฆแƒ˜แƒแƒ แƒ”แƒ‘แƒ)
  2. แƒ“แƒ˜แƒ“แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ, แƒ”.แƒ˜. แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ›แƒ แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒฃแƒœแƒ“แƒ แƒแƒ˜แƒชแƒ˜แƒšแƒแƒก แƒแƒ แƒแƒกแƒแƒญแƒ˜แƒ แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ แƒ”แƒšแƒ”แƒ”แƒ‘แƒ˜
  3. แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜แƒก แƒ’แƒแƒฃแƒฅแƒ›แƒ”แƒ‘แƒ ("แƒกแƒฃแƒคแƒ—แƒ" UDP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ)
  4. แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒ—
  5. แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ–แƒ” แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ”แƒ แƒ—แƒ”แƒฃแƒšแƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ

แƒ”แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜ แƒ“แƒ˜แƒ“แƒฌแƒ˜แƒšแƒแƒ“ แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒกแƒแƒœแƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒ rfc908 ะธ rfc1151แƒ“แƒ แƒ›แƒ” แƒ•แƒ”แƒงแƒ แƒ“แƒœแƒแƒ‘แƒแƒ“แƒ˜ แƒแƒ› แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒ”แƒ‘แƒก แƒแƒ› แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก.

แƒแƒ› แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒแƒ“, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ•แƒแƒ“แƒ”แƒ‘แƒก แƒแƒ  แƒฅแƒกแƒ”แƒšแƒฃแƒ  แƒ™แƒ•แƒแƒœแƒซแƒก แƒจแƒแƒ แƒ˜แƒก TCP แƒ“แƒ UDP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ›แƒแƒ“แƒ˜แƒ— แƒแƒ แƒ˜แƒ•แƒ” แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ“แƒแƒ’แƒ•แƒ™แƒแƒ แƒ’แƒแƒ•แƒก แƒ”แƒ แƒ—แƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜.
แƒแƒ แƒแƒ˜แƒœแƒขแƒ”แƒ แƒแƒฅแƒขแƒ˜แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ TCP-แƒ–แƒ”:แƒกแƒแƒœแƒ“แƒ Udp แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ .Net-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒฅแƒ”แƒ›แƒ˜แƒ“แƒแƒœ แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, TCP แƒแƒฆแƒ›แƒแƒแƒฉแƒ”แƒœแƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒš แƒžแƒแƒ™แƒ”แƒขแƒก แƒ“แƒ แƒแƒชแƒœแƒแƒ‘แƒ”แƒ‘แƒก แƒ›แƒแƒก แƒ’แƒแƒ›แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒกแƒ”แƒ’แƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒœแƒแƒ›แƒ แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒ—.
แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ UDP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒ—:แƒกแƒแƒœแƒ“แƒ Udp แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ .Net-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

UDP แƒแƒ  แƒ˜แƒฆแƒ”แƒ‘แƒก แƒ–แƒแƒ แƒแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒšแƒ”แƒœแƒ˜แƒก แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒก. UDP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒšแƒแƒ‘แƒแƒ.

TCP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒจแƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒšแƒ”แƒœแƒ แƒ›แƒ˜แƒ˜แƒฆแƒฌแƒ”แƒ•แƒ แƒ‘แƒแƒšแƒ แƒ™แƒ•แƒแƒœแƒซแƒ—แƒแƒœ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ˜แƒ—, แƒแƒ› แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒ—, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒจแƒ˜ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒฅแƒ•แƒ˜แƒ—แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ›แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ”แƒ‘แƒšแƒแƒ“ (แƒแƒœแƒฃ แƒ”แƒ แƒ—แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜ แƒกแƒ”แƒ’แƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”), TCP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒ”แƒ’แƒ แƒ”แƒ— แƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒš แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒคแƒแƒœแƒฏแƒแƒ แƒแƒก - แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒกแƒ”แƒ’แƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜ แƒ›แƒแƒ”แƒšแƒ˜แƒก.

แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก TCP แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ˜แƒฎ rfc793, UDP-แƒ“แƒแƒœ rfc768แƒกแƒแƒ“แƒแƒช, แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜แƒ.

แƒ–แƒ”แƒ›แƒแƒแƒฆแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜แƒ“แƒแƒœ แƒ˜แƒ แƒ™แƒ•แƒ”แƒ•แƒ, แƒ แƒแƒ› UDP-แƒ–แƒ” แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ (แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒจแƒ˜ แƒกแƒแƒœแƒ“แƒ UDP), แƒกแƒแƒญแƒ˜แƒ แƒแƒ TCP-แƒ˜แƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ. แƒ™แƒ”แƒ แƒซแƒแƒ“:

  • แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ
  • แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒกแƒ”แƒ’แƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒœแƒฃแƒ›แƒ”แƒ แƒแƒชแƒ˜แƒ
  • แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒฃแƒ แƒ˜ แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜
  • แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ’แƒแƒ›แƒขแƒแƒ แƒฃแƒœแƒแƒ แƒ˜แƒแƒœแƒแƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒ–แƒ แƒ“แƒ”แƒšแƒแƒ“

แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ—:

  • แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜, แƒ แƒแƒ—แƒ แƒ’แƒแƒ›แƒแƒงแƒแƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก
  • แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ— แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒกแƒ แƒฃแƒšแƒ˜แƒก แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜, แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ แƒ–แƒ”แƒ›แƒแƒ— แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒ“แƒ แƒ’แƒแƒแƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒแƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜
  • แƒœแƒ”แƒ‘แƒ แƒ›แƒ˜แƒ”แƒชแƒ˜แƒ— แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒฃแƒ  แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒก แƒ’แƒแƒ›แƒแƒ แƒ—แƒแƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜ "แƒกแƒฃแƒคแƒ—แƒ" UDP-แƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ—

แƒกแƒแƒœแƒ“แƒ UDP แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜

แƒจแƒ”แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ—, แƒ แƒแƒ› UDP แƒ“แƒแƒขแƒแƒ’แƒ แƒแƒ›แƒ แƒฉแƒแƒกแƒ›แƒฃแƒšแƒ˜แƒ IP แƒ“แƒแƒขแƒแƒ’แƒ แƒแƒ›แƒแƒจแƒ˜. แƒกแƒแƒœแƒ“แƒ UDP แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒกแƒแƒ—แƒแƒœแƒแƒ“แƒแƒ“ "แƒจแƒ”แƒคแƒฃแƒ—แƒฃแƒšแƒ˜แƒ" UDP แƒ“แƒแƒขแƒแƒ’แƒ แƒแƒ›แƒแƒจแƒ˜.
แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ UDP แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒก แƒ˜แƒœแƒ™แƒแƒžแƒกแƒฃแƒšแƒแƒชแƒ˜แƒ:แƒกแƒแƒœแƒ“แƒ Udp แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ .Net-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ UDP แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ:

แƒกแƒแƒœแƒ“แƒ Udp แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ .Net-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

  • แƒ“แƒ แƒแƒจแƒ”แƒ‘แƒ˜ - แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜แƒก แƒ“แƒ แƒแƒจแƒ”แƒ‘แƒ˜
  • MessageType - แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒขแƒ˜แƒžแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ”แƒœ แƒ–แƒ”แƒ“แƒ แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“
  • TransmissionId - แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜, แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ—แƒแƒœ แƒ“แƒ แƒžแƒแƒ แƒขแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“, แƒชแƒแƒšแƒกแƒแƒฎแƒแƒ“ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒก
  • PacketNumber - แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜
  • แƒแƒคแƒชแƒ˜แƒ”แƒ‘แƒ˜ - แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ˜แƒ’แƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ›แƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ“แƒ แƒแƒจแƒ”แƒ‘แƒ˜ แƒแƒกแƒ”แƒ—แƒ˜แƒ:

  • FirstPacket - แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜
  • NoAsk - แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ แƒแƒ  แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜แƒก แƒฉแƒแƒ แƒ—แƒ•แƒแƒก
  • LastPacket - แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒšแƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜
  • RequestForPacket - แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒแƒœ แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ

แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ–แƒแƒ’แƒแƒ“แƒ˜ แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ”แƒ‘แƒ˜

แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒกแƒแƒœแƒ“แƒ UDP แƒแƒ แƒ˜แƒ”แƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒ  แƒ™แƒ•แƒแƒœแƒซแƒก แƒจแƒแƒ แƒ˜แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒแƒœแƒขแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒแƒ–แƒ”, แƒ›แƒแƒก แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ”แƒซแƒšแƒแƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ แƒ›แƒ”แƒแƒ แƒ” แƒ›แƒฎแƒแƒ แƒ”แƒกแƒ—แƒแƒœ. แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒกแƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒšแƒแƒ“, แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒก FirstPacket แƒ“แƒ แƒแƒจแƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒช แƒžแƒแƒกแƒฃแƒฎแƒ˜ แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒแƒก. แƒงแƒ•แƒ”แƒšแƒ แƒกแƒแƒžแƒแƒกแƒฃแƒฎแƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜, แƒแƒœ แƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒแƒ—, แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜, แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒแƒ“แƒ’แƒ”แƒœแƒก PacketNumber แƒ•แƒ”แƒšแƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒแƒก แƒ”แƒ แƒ—แƒ˜แƒ— แƒ›แƒ”แƒขแƒ˜, แƒ•แƒ˜แƒ“แƒ แƒ” แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒฃแƒ“แƒ˜แƒ“แƒ”แƒกแƒ˜ PacketNumber แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ. แƒแƒคแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒšแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒ แƒ˜แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ›แƒ.

แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฌแƒงแƒ•แƒ”แƒขแƒแƒ“. LastPacket แƒ“แƒ แƒแƒจแƒ แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒšแƒ แƒžแƒแƒ™แƒ”แƒขแƒ–แƒ”. แƒกแƒแƒžแƒแƒกแƒฃแƒฎแƒ แƒžแƒแƒ™แƒ”แƒขแƒจแƒ˜ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ‘แƒแƒšแƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜ + 1, แƒ แƒแƒช แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜ แƒ›แƒฎแƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒš แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒแƒก.
แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒจแƒ”แƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒก แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒ:แƒกแƒแƒœแƒ“แƒ Udp แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ .Net-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒ“แƒแƒ›แƒงแƒแƒ แƒ“แƒ”แƒ‘แƒ, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ’แƒแƒ“แƒแƒ˜แƒชแƒ”แƒ›แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ”แƒ‘แƒจแƒ˜. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ‘แƒšแƒแƒ™แƒ˜, แƒ’แƒแƒ แƒ“แƒ แƒฃแƒ™แƒแƒœแƒแƒกแƒ™แƒœแƒ”แƒšแƒ˜แƒกแƒ, แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก. แƒ˜แƒก แƒฃแƒ“แƒ แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก/แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒ–แƒแƒ›แƒแƒก. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒšแƒ แƒ‘แƒšแƒแƒ™แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒฐแƒฅแƒแƒœแƒ“แƒ”แƒก แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœ แƒ›แƒฎแƒแƒ แƒ” แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒแƒก แƒแƒœ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒขแƒแƒ•แƒ”แƒ‘แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก/แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒคแƒแƒœแƒฏแƒแƒ แƒแƒก แƒฆแƒ˜แƒ แƒžแƒแƒกแƒฃแƒฎแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒฆแƒ”แƒ‘แƒแƒ“. แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก/แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒคแƒแƒœแƒฏแƒแƒ แƒ แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ แƒ“แƒ แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ‘แƒšแƒแƒ™แƒ˜.

แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜ แƒ›แƒฎแƒแƒ แƒ” แƒ˜แƒฆแƒ”แƒ‘แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒก. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒ›แƒแƒฌแƒ›แƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ—แƒ แƒœแƒแƒฎแƒแƒ—, แƒ›แƒแƒฎแƒ•แƒ“แƒ”แƒ‘แƒ แƒ—แƒฃ แƒแƒ แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒคแƒแƒœแƒฏแƒแƒ แƒแƒจแƒ˜. แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ™แƒแƒขแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒแƒ  แƒ›แƒแƒฎแƒ•แƒ“แƒ”แƒ‘แƒ แƒคแƒแƒœแƒฏแƒแƒ แƒแƒจแƒ˜, แƒ˜แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ. แƒ˜แƒ›แƒ˜แƒขแƒแƒ› แƒ แƒแƒ› แƒ—แƒฃ แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒ–แƒแƒ›แƒ แƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ”แƒ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒ•แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒคแƒแƒœแƒฏแƒแƒ แƒ แƒ’แƒแƒ“แƒแƒ“แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒฆแƒ”แƒ‘แƒแƒ“ แƒ“แƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ แƒฎแƒ“แƒ”แƒ‘แƒ. แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜. แƒ—แƒฃ แƒคแƒแƒœแƒฏแƒแƒ แƒ แƒแƒ  แƒ˜แƒ•แƒกแƒ”แƒ‘แƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ“แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒš แƒ•แƒแƒ“แƒแƒจแƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ–แƒ”แƒ“แƒแƒช แƒแƒ  แƒ˜แƒฅแƒœแƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ’แƒแƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒแƒ–แƒ”.
แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒ:แƒกแƒแƒœแƒ“แƒ Udp แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ .Net-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ•แƒแƒ“แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜

แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ—แƒฃ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜ แƒ›แƒฎแƒแƒ แƒ” แƒฎแƒแƒ–แƒ’แƒแƒ แƒ”แƒจแƒ”แƒ. แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ˜แƒกแƒแƒก, แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒ“แƒแƒ˜แƒฎแƒฃแƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒแƒ˜แƒก แƒแƒ›แƒแƒฌแƒฃแƒ แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒ. แƒกแƒแƒœแƒ“แƒ UDP แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒแƒ  แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒก แƒ“แƒ แƒแƒ˜แƒก แƒแƒ›แƒแƒฌแƒฃแƒ แƒ•แƒ˜แƒก แƒ“แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“. แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜, แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒ›แƒแƒกแƒžแƒ˜แƒœแƒซแƒšแƒ˜แƒก แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒก แƒ›แƒแƒšแƒแƒ“แƒ˜แƒœแƒจแƒ˜. แƒ—แƒฃ แƒ˜แƒก แƒ”แƒจแƒ•แƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ”แƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒ‘แƒแƒšแƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ. แƒ—แƒฃ แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜ แƒ˜แƒฌแƒฃแƒ แƒ”แƒ‘แƒ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ–แƒ”, แƒ›แƒแƒจแƒ˜แƒœ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ แƒ“แƒ แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘.

แƒ›แƒ”แƒแƒ แƒ” แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜ แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ˜แƒกแƒแƒก แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก แƒ™แƒแƒ›แƒฃแƒœแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜. แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ“แƒแƒœ, แƒ˜แƒก แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜แƒก แƒ•แƒแƒ“แƒ˜แƒก แƒแƒ›แƒแƒฌแƒฃแƒ แƒ•แƒ˜แƒกแƒ—แƒแƒœแƒแƒ•แƒ” แƒ“แƒ แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒžแƒแƒกแƒฃแƒฎแƒก แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒ“แƒแƒœ. แƒ—แƒฃ แƒžแƒแƒกแƒฃแƒฎแƒ˜ แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒš แƒ•แƒแƒ“แƒแƒจแƒ˜, แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒฌแƒงแƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜ แƒ˜แƒฎแƒกแƒœแƒ”แƒ‘แƒ. แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜ แƒ›แƒฎแƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ˜แƒก แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜แƒก แƒแƒ แƒฏแƒ”แƒ  แƒแƒ›แƒแƒฌแƒฃแƒ แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’. แƒ”แƒก แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒ•แƒ˜แƒก แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒกแƒแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜ แƒแƒ›แƒแƒ˜แƒฌแƒฃแƒ แƒ”แƒ‘แƒ, แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒฌแƒงแƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜ แƒ˜แƒฎแƒกแƒœแƒ”แƒ‘แƒ.

แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ UDP แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒ

แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ”แƒ‘แƒ˜ แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ˜แƒšแƒ˜แƒ แƒกแƒแƒกแƒ แƒฃแƒšแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒจแƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒš แƒšแƒแƒ’แƒ˜แƒ™แƒแƒ–แƒ”.
แƒกแƒแƒœแƒ“แƒ UDP แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒ:

แƒกแƒแƒœแƒ“แƒ Udp แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ .Net-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ˜แƒก - แƒ”แƒก แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒ, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ“แƒ แƒ“แƒแƒกแƒแƒกแƒ แƒฃแƒšแƒ˜ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒแƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ˜แƒก แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ UDP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ˜แƒ—, แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒก แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒ›แƒก แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒก แƒ“แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒแƒก.

FirstPacketSending โ€“ แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒกแƒแƒก.

แƒแƒ› แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ, แƒกแƒแƒ“แƒแƒช แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ.

แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒชแƒ˜แƒ™แƒšแƒ˜ โ€“ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ›แƒแƒกแƒ–แƒ” แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒ แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒแƒ“แƒแƒœ FirstPacketSending แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’. แƒกแƒฌแƒแƒ แƒ”แƒ“ แƒแƒ› แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ แƒ›แƒแƒ“แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒแƒฆแƒ˜แƒแƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘. แƒ›แƒ˜แƒกแƒ’แƒแƒœ แƒ’แƒแƒกแƒ•แƒšแƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒแƒ  แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ - แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒแƒ“ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒแƒœ แƒขแƒแƒ˜แƒ›แƒแƒฃแƒขแƒ˜แƒ—.

FirstPacketReceived โ€“ แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ˜แƒก แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜แƒก แƒกแƒ˜แƒกแƒฌแƒแƒ แƒ”แƒก, แƒฅแƒ›แƒœแƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ”แƒ‘แƒก แƒ“แƒ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒแƒก.

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ แƒ”แƒ แƒ—แƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒกแƒ’แƒแƒœ แƒ“แƒ แƒ’แƒแƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒขแƒ™แƒ˜แƒชแƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ”แƒก แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒ. แƒแƒกแƒ”แƒ—แƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒ˜แƒฎแƒฃแƒ แƒ”แƒ‘แƒ.

แƒ˜แƒ™แƒ แƒ˜แƒ‘แƒ”แƒ‘แƒ - แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒฆแƒ”แƒ‘แƒแƒ“.

แƒ˜แƒก แƒฌแƒ”แƒ แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒก แƒ“แƒ แƒแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒกแƒแƒœแƒแƒฎแƒแƒ“, แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒ•แƒแƒก, แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒแƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒ—แƒ”แƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒ’แƒแƒ“แƒแƒ“แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜, แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ“แƒ แƒ แƒ’แƒแƒ“แƒ˜แƒก.

แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ โ€“ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜.

แƒ”แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ™แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ แƒ“แƒแƒ˜แƒ™แƒแƒ แƒ’แƒ แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ’แƒ–แƒแƒ–แƒ”. แƒแƒ› แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒกแƒ•แƒšแƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒแƒ˜แƒก แƒแƒ›แƒแƒฌแƒฃแƒ แƒ•แƒ˜แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒฎแƒฃแƒ แƒฃแƒšแƒแƒ“ แƒ˜แƒ—แƒ•แƒšแƒ”แƒ‘แƒ.

แƒฃแƒคแƒ แƒ แƒฆแƒ แƒ›แƒแƒ“ แƒจแƒ”แƒ•แƒ˜แƒ“แƒ แƒ™แƒแƒ“แƒ˜. แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜แƒก แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ

แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ UDP-แƒ˜แƒก แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜. แƒแƒ› แƒ‘แƒšแƒแƒ™แƒ˜แƒก แƒแƒ›แƒแƒชแƒแƒœแƒแƒ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒก แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ“แƒแƒ›แƒฎแƒ›แƒแƒ แƒ” แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜, แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ–แƒ”, แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒจแƒ˜ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก API-แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ. แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ˜ แƒ˜แƒฆแƒ”แƒ‘แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒก UDP แƒคแƒ”แƒœแƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒ›แƒก แƒ›แƒแƒ— แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒก แƒ“แƒแƒกแƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒแƒ“. แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒฆแƒ”แƒ‘แƒแƒ“ แƒ˜แƒก แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒก แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒš UDP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก.
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 แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ:

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 แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒก, แƒกแƒแƒ“แƒแƒช แƒฎแƒ“แƒ”แƒ‘แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ. แƒแƒ‘แƒกแƒขแƒ แƒแƒฅแƒขแƒฃแƒšแƒ˜ แƒ™แƒšแƒแƒกแƒ˜ 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();
}

แƒ”แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒแƒจแƒ˜ แƒแƒ™แƒ แƒซแƒแƒšแƒฃแƒšแƒ˜แƒ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜.
แƒ“แƒแƒกแƒ แƒฃแƒšแƒ“แƒ.DisposeByTimeout:

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

ProcessPackets แƒ›แƒ”แƒ—แƒแƒ“แƒ˜

ProcessPackets แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒแƒœ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒแƒ–แƒ”. แƒ“แƒแƒ แƒ”แƒ™แƒ•แƒ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒแƒœ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒแƒšแƒแƒ“แƒ˜แƒœแƒ˜แƒก แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—.

แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ แƒ˜แƒ™แƒ แƒ˜แƒ‘แƒ”แƒ‘แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ™แƒ แƒซแƒแƒšแƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒแƒ–แƒ” แƒ“แƒ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒ–แƒ” แƒ’แƒแƒ“แƒแƒกแƒ•แƒšแƒแƒ–แƒ” แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜, แƒ‘แƒแƒšแƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ•แƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜
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);
}

แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒฉแƒ”แƒ แƒ”แƒ‘แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒš แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒก แƒ“แƒ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒแƒก แƒแƒ‘แƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒก.
Completed.ProcessPackets:

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

ReceivePacket แƒ›แƒ”แƒ—แƒแƒ“แƒ˜

แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ FirstPacketReceived แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒแƒ แƒ“แƒแƒแƒ“แƒ’แƒ˜แƒœแƒแƒก, แƒ›แƒแƒ แƒ—แƒšแƒแƒช แƒ›แƒแƒ•แƒ˜แƒ“แƒ แƒ—แƒฃ แƒแƒ แƒ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜, แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒแƒ’แƒ แƒแƒ•แƒแƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ แƒ”แƒ แƒ—แƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒกแƒ’แƒแƒœ.
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);
  }
}

แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒแƒจแƒ˜ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒชแƒ˜แƒ™แƒšแƒ˜ แƒ”แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ™แƒ แƒซแƒแƒšแƒฃแƒšแƒ˜แƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒฆแƒ”แƒ‘แƒแƒ“.
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 แƒ›แƒ”แƒ—แƒแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒแƒก แƒแƒฎแƒแƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.
แƒ’แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ:

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 แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ):

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 แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒ˜แƒฆแƒ”แƒ‘แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒš แƒžแƒแƒ™แƒ”แƒขแƒก, แƒฅแƒ›แƒœแƒ˜แƒก แƒแƒฎแƒแƒšแƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ“แƒ แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒ›แƒก แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒก, แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒ’แƒแƒแƒœแƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒ—, แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก ReceivePacket แƒ›แƒ”แƒ—แƒแƒ“แƒก FirstPacketReceived
แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘ แƒ›แƒฎแƒแƒ แƒ”แƒก:

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 แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ):

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 แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ›แƒแƒ แƒ—แƒแƒšแƒ˜แƒ. แƒ”แƒก แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒ–แƒ”.

แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒแƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒ‘แƒแƒšแƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ.
แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ˜แƒก แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜แƒก แƒฉแƒแƒ แƒ—แƒ•แƒ (SendingCycle แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ):

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

แƒฃแƒคแƒ แƒ แƒฆแƒ แƒ›แƒแƒ“ แƒจแƒ”แƒ•แƒ˜แƒ“แƒ แƒ™แƒแƒ“แƒ˜. แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ˜แƒก แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜:แƒกแƒแƒœแƒ“แƒ 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);
      }
    }
    // ...
  }
}

แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒก แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒ“แƒ แƒ’แƒแƒฃแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒก. แƒแƒฆแƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜แƒ, แƒ แƒแƒ› แƒแƒ› แƒ›แƒแƒ›แƒ”แƒœแƒขแƒจแƒ˜ แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ›แƒ แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒ˜แƒฌแƒงแƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒฎแƒฃแƒ แƒ•แƒ˜แƒก แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜ แƒ“แƒ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒฃแƒšแƒ˜แƒ.
แƒ“แƒแƒ™แƒแƒ แƒ’แƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ (SendingCycle แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ):

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

แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜ (แƒžแƒแƒ™แƒ”แƒขแƒ˜ #3 แƒ“แƒ˜แƒแƒ’แƒ แƒแƒ›แƒแƒจแƒ˜) แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒ—. แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒœแƒฏแƒแƒ แƒ แƒกแƒแƒ•แƒกแƒ”แƒ แƒ—แƒฃ แƒแƒ แƒ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ แƒแƒฆแƒ“แƒ’แƒ”แƒ‘แƒ.
แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒœแƒฏแƒแƒ แƒแƒจแƒ˜ แƒ“แƒแƒ แƒขแƒงแƒ›แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ (แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ):

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

แƒกแƒแƒœแƒ“แƒ UDP API

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ—แƒแƒœ แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—, แƒแƒ แƒ˜แƒก แƒฆแƒ˜แƒ แƒกแƒแƒœแƒ“แƒ Udp แƒ™แƒšแƒแƒกแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ แƒ˜แƒก แƒ’แƒแƒ“แƒแƒกแƒแƒคแƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ˜แƒก แƒ‘แƒšแƒแƒ™แƒ–แƒ”. แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ™แƒšแƒแƒกแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒฌแƒ”แƒ•แƒ แƒ”แƒ‘แƒ˜:

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

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒฌแƒ”แƒ แƒ˜แƒ—. แƒฎแƒ”แƒšแƒ›แƒแƒฌแƒ”แƒ แƒ˜แƒก แƒ“แƒ”แƒšแƒ”แƒ’แƒ˜แƒ แƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก:

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

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ:

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

แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒขแƒ˜แƒžแƒ˜แƒก แƒ“แƒ/แƒแƒœ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒแƒ แƒ˜ แƒแƒ แƒแƒกแƒแƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜: ReliableUdpMessageTypes messageType แƒ“แƒ IPEndPoint ipEndPoint.

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒขแƒ˜แƒžแƒ”แƒ‘แƒ˜:

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

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒแƒ“; แƒแƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜ แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒก แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒก:

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

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ true - แƒ—แƒฃ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒแƒฆแƒฌแƒ˜แƒ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒก แƒ“แƒ false - แƒ—แƒฃ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒ“แƒแƒ˜แƒฎแƒฃแƒ แƒ แƒ“แƒ แƒแƒ˜แƒก แƒแƒ›แƒแƒฌแƒฃแƒ แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒ:

public bool EndSendMessage(IAsyncResult asyncResult)

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ แƒแƒ› แƒแƒ  แƒแƒ แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜. แƒ—แƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒขแƒงแƒ•แƒ˜แƒกแƒ˜ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ”แƒ‘แƒ˜, แƒ’แƒแƒ›แƒแƒœแƒแƒ™แƒšแƒ˜แƒกแƒ˜แƒก แƒ“แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ, แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒแƒ แƒกแƒ˜, แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒšแƒแƒ’แƒ˜แƒ™แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ, แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒ•แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ, แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก.

แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒ›แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜แƒก แƒ“แƒ”แƒ›แƒแƒœแƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒแƒ“ แƒซแƒšแƒ˜แƒ”แƒ แƒ˜ แƒ“แƒ แƒ›แƒแƒฅแƒœแƒ˜แƒšแƒ˜แƒ, แƒ แƒแƒ› แƒ“แƒแƒแƒ™แƒ›แƒแƒงแƒแƒคแƒ˜แƒšแƒแƒก แƒแƒ“แƒ แƒ” แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒ›แƒ˜แƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ, แƒ แƒแƒ› แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ“แƒ”แƒก. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ’แƒแƒ›แƒขแƒแƒ แƒฃแƒœแƒแƒ แƒ˜แƒแƒœแƒแƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒ–แƒ แƒ“แƒ”แƒšแƒแƒ“ แƒ“แƒ แƒขแƒแƒ˜แƒ›แƒ”แƒ แƒ˜แƒก แƒžแƒ”แƒ แƒ˜แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒแƒ“ แƒจแƒ”แƒกแƒแƒชแƒ•แƒšแƒ”แƒšแƒแƒ“, แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ”แƒ›แƒแƒขแƒแƒก แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒ›แƒแƒชแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒคแƒแƒœแƒฏแƒแƒ แƒ แƒ“แƒ 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. แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ: CLR แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ ะธ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒœแƒ•แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— IAsyncResult แƒ“แƒ˜แƒ–แƒแƒ˜แƒœแƒ˜แƒก แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜
  8. แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒžแƒแƒ แƒขแƒ˜แƒ แƒ”แƒ‘แƒ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒš แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒš แƒจแƒแƒ‘แƒšแƒแƒœแƒ–แƒ” (APM TAP-แƒจแƒ˜):
    TPL แƒ“แƒ แƒขแƒ แƒแƒ“แƒ˜แƒชแƒ˜แƒฃแƒšแƒ˜ .NET แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ
    แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ แƒกแƒฎแƒ•แƒ แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒš แƒœแƒ˜แƒ›แƒฃแƒจแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒ แƒขแƒ˜แƒžแƒ”แƒ‘แƒ—แƒแƒœ

แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ: แƒ’แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ— แƒ›แƒแƒ˜แƒแƒ แƒแƒ•แƒž ะธ แƒกแƒ˜แƒ“แƒ แƒ˜แƒกแƒขแƒ˜แƒŸ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒ“แƒ”แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ˜แƒก แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒแƒ‘แƒ แƒซแƒ•แƒ”แƒš แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒš แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ—แƒแƒœ แƒแƒ  แƒ˜แƒ แƒฆแƒ•แƒ”แƒ•แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ›แƒ”-4 แƒฉแƒแƒ แƒฉแƒ แƒ›แƒฎแƒแƒ แƒก แƒฃแƒญแƒ”แƒ แƒก แƒแƒ แƒ˜แƒ•แƒ” XP แƒ“แƒ 2003 แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ