.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจฌเจนเฉเจค เจธเจฎเจพเจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจฌเจฆเจฒ เจ—เจฟเจ† เจนเฉˆ. เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจฆเฉ‡ เจฎเฉเฉฑเจ– เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• - UDP เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจจเจพ เจธเจฟเจฐเจซเจผ เจกเฉ‡เจŸเจพเจ—เฉเจฐเจพเจฎ เจ…เจคเฉ‡ เจชเฉเจฐเจธเจพเจฐเจฃ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจธเจ—เฉ‹เจ‚ เจจเฉˆเจŸเจตเจฐเจ• เจจเฉ‹เจกเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ "เจชเฉ€เจ…เจฐ-เจŸเฉ‚-เจชเฉ€เจ…เจฐ" เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฒเจˆ เจตเฉ€ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ‡เจธเจฆเฉ‡ เจธเจงเจพเจฐเจจ เจกเจฟเจœเจผเจพเจ‡เจจ เจฆเฉ‡ เจ•เจพเจฐเจจ, เจ‡เจธ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพเจ‚ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจ—เฉˆเจฐ-เจฏเฉ‹เจœเจจเจพเจฌเฉฑเจง เจตเจฐเจคเฉ‹เจ‚ เจนเจจ, เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ€เจ†เจ‚ เจ•เจฎเฉ€เจ†เจ‚, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ—เจพเจฐเฉฐเจŸเฉ€เจธเจผเฉเจฆเจพ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ€ เจ•เจฎเฉ€, เจ•เจฟเจคเฉ‡ เจตเฉ€ เจ—เจพเจ‡เจฌ เจจเจนเฉ€เจ‚ เจนเฉ‹เจˆ เจนเฉˆเฅค เจ‡เจน เจฒเฉ‡เจ– UDP เจ‰เฉฑเจคเฉ‡ เจ—เจพเจฐเฉฐเจŸเฉ€เจธเจผเฉเจฆเจพ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
เจธเจฎเฉฑเจ—เจฐเฉ€:เจ‡เฉฐเจฆเจฐเจพเจœเจผ
เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฒเฉ‹เฉœเจพเจ‚
เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจธเจฟเจฐเจฒเฉ‡เจ–
เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ‡ เจ†เจฎ เจธเจฟเจงเจพเจ‚เจค
เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจคเฉ€ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจŸเจพเจˆเจฎเจฐ
เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจธเจŸเฉ‡เจŸ เจกเจพเจ‡เจ—เฉเจฐเจพเจฎ
เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ‡. เจธเฉฐเจšเจพเจฐ เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจฏเฉ‚เจจเจฟเจŸ
เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ‡. เจฐเจพเจœ

เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ‡. เจ•เจจเฉˆเจ•เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ
เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ‡. เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจค เจนเฉ‹เจฃ 'เจคเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเฉฐเจฆ เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ
เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ‡. เจกเจพเจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจจเฉ‚เฉฐ เจฌเจนเจพเจฒ เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ
เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP API
เจธเจฟเฉฑเจŸเจพ
เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจฒเจฟเฉฐเจ• เจ…เจคเฉ‡ เจฒเฉ‡เจ–

เจ‡เฉฐเจฆเจฐเจพเจœเจผ

เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจฆเฉ€ เจ…เจธเจฒ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจจเฉ‡ เจ‡เฉฑเจ• เจธเจฎเจพเจจ เจเจกเจฐเฉˆเฉฑเจธ เจธเจชเฉ‡เจธ เจจเฉ‚เฉฐ เจฎเฉฐเจจเจฟเจ† เจœเจฟเจธ เจตเจฟเฉฑเจš เจนเจฐเฉ‡เจ• เจจเฉ‹เจก เจฆเจพ เจ‡เฉฑเจ• เจ—เจฒเฉ‹เจฌเจฒ เจ…เจคเฉ‡ เจตเจฟเจฒเฉฑเจ–เจฃ IP เจเจกเจฐเฉˆเฉฑเจธ เจธเฉ€ เจ…เจคเฉ‡ เจ‰เจน เจฆเฉ‚เจœเฉ‡ เจจเฉ‹เจกเจพเจ‚ เจจเจพเจฒ เจธเจฟเฉฑเจงเจพ เจธเฉฐเจšเจพเจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจธเฉ€เฅค เจนเฉเจฃ เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ, เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเจพ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจนเฉˆ - เจ—เจฒเฉ‹เจฌเจฒ IP เจชเจคเจฟเจ†เจ‚ เจฆเจพ เจ‡เฉฑเจ• เจ–เฉ‡เจคเจฐ เจ…เจคเฉ‡ NAT เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจฆเฉ‡ เจชเจฟเฉฑเจ›เฉ‡ เจฒเฉเจ•เฉ‡ เจนเฉ‹เจ เจจเจฟเฉฑเจœเฉ€ เจชเจคเจฟเจ†เจ‚ เจตเจพเจฒเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจ–เฉ‡เจคเจฐเฅคเจ‡เจธ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจตเจฟเฉฑเจš, เจ—เจฒเฉ‹เจฌเจฒ เจเจกเจฐเฉˆเฉฑเจธ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซเจผ เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจนเฉ€ เจจเฉˆเฉฑเจŸเจตเจฐเจ• 'เจคเฉ‡ เจ•เจฟเจธเฉ‡ เจจเจพเจฒ เจตเฉ€ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจธเฉฐเจšเจพเจฐ เจ•เจฐ เจธเจ•เจฆเฉ€เจ†เจ‚ เจนเจจ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจตเจฟเจฒเฉฑเจ–เจฃ, เจตเจฟเจธเจผเจต เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจฐเฉ‚เจŸเฉ‡เจฌเจฒ IP เจเจกเจฐเฉˆเฉฑเจธ เจนเฉˆเฅค เจ‡เฉฑเจ• เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจจเฉˆเฉฑเจŸเจตเจฐเจ• 'เจคเฉ‡ เจ‡เฉฑเจ• เจจเฉ‹เจก เจ‰เจธเฉ‡ เจจเฉˆเฉฑเจŸเจตเจฐเจ• 'เจคเฉ‡ เจฆเฉ‚เจœเฉ‡ เจจเฉ‹เจกเจพเจ‚ เจจเจพเจฒ เจœเฉเฉœ เจธเจ•เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ—เจฒเฉ‹เจฌเจฒ เจเจกเจฐเฉˆเฉฑเจธ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจœเจพเจฃเฉ‡-เจชเจ›เจพเจฃเฉ‡ เจจเฉ‹เจกเจพเจ‚ เจจเจพเจฒ เจตเฉ€ เจœเฉเฉœ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจชเจฐเจธเจชเจฐ เจ•เฉเจฐเจฟเจ† เจตเฉฑเจกเฉ‡ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจเจกเจฐเฉˆเฉฑเจธ เจ…เจจเฉเจตเจพเจฆ เจตเจฟเจงเฉ€ เจฆเฉ‡ เจ•เจพเจฐเจจ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค NAT เจกเจฟเจตเจพเจˆเจธเจพเจ‚, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ Wi-Fi เจฐเจพเจŠเจŸเจฐ, เจ†เจŠเจŸเจ—เฉ‹เจ‡เฉฐเจ— เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฒเจˆ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจจเฉเจตเจพเจฆ เจŸเฉ‡เจฌเจฒ เจเจ‚เจŸเจฐเฉ€เจ†เจ‚ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจตเจฟเฉฑเจš IP เจเจกเจฐเฉˆเฉฑเจธ เจ…เจคเฉ‡ เจชเฉ‹เจฐเจŸ เจจเฉฐเจฌเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉ‹เจงเจฆเฉ‡ เจนเจจเฅค เจ‡เจน เจ—เจฒเฉ‹เจฌเจฒ เจเจกเจฐเฉˆเฉฑเจธ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจนเฉ‹เจธเจŸเจพเจ‚ เจฒเจˆ เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจคเฉ‹เจ‚ เจ†เจŠเจŸเจ—เฉ‹เจ‡เฉฐเจ— เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจชเจฐ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚, NAT เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจธเจพเจฐเฉ‡ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฆเฉ€เจ†เจ‚ เจนเจจ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจฟ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฒเจˆ เจตเฉฑเจ–เจฐเฉ‡ เจจเจฟเจฏเจฎ เจจเจฟเจฐเจงเจพเจฐเจค เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค

เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจฆเจพ เจ‡เจน เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ-เจธเจฐเจตเจฐ เจธเฉฐเจšเจพเจฐ เจฒเจˆ เจ•เจพเจซเจผเฉ€ เจธเจนเฉ€ เจนเฉˆ, เจœเจฟเฉฑเจฅเฉ‡ เจ•เจฒเจพเจ‡เฉฐเจŸ เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจจเฉˆเจŸเจตเจฐเจ• เจตเจฟเฉฑเจš เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจธเจฐเจตเจฐเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจ—เจฒเฉ‹เจฌเจฒ เจชเจคเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจชเจฐ เจ‡เจน เจตเจฟเจšเจ•เจพเจฐ เจฆเฉ‹ เจจเฉ‹เจกเจพเจ‚ เจฆเฉ‡ เจธเจฟเฉฑเจงเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฒเจˆ เจฎเฉเจธเจผเจ•เจฒ เจชเฉˆเจฆเจพ เจ•เจฐเจฆเจพ เจนเฉˆ เจตเฉฑเจ– - เจตเฉฑเจ– เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจจเฉˆเฉฑเจŸเจตเจฐเจ•. เจชเฉ€เจ…เจฐ-เจŸเฉ‚-เจชเฉ€เจ…เจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจตเฉŒเจ‡เจธ เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ (เจธเจ•เจพเจˆเจช), เจ•เฉฐเจชเจฟเจŠเจŸเจฐ (เจŸเฉ€เจฎเจตเจฟเจŠเจ…เจฐ) เจคเฉฑเจ• เจฐเจฟเจฎเฉ‹เจŸ เจชเจนเฉเฉฐเจš เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ, เจœเจพเจ‚ เจ”เจจเจฒเจพเจˆเจจ เจ—เฉ‡เจฎเจฟเฉฐเจ— เจฒเจˆ เจฆเฉ‹ เจจเฉ‹เจกเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจธเจฟเฉฑเจงเจพ เจธเฉฐเจชเจฐเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆเฅค

เจตเฉฑเจ–-เจตเฉฑเจ– เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจจเฉˆเฉฑเจŸเจตเจฐเจ•เจพเจ‚ 'เจคเฉ‡ เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจชเฉ€เจ…เจฐ-เจŸเฉ‚-เจชเฉ€เจ…เจฐ เจ•เจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ€ เจขเฉฐเจ—เจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจจเฉ‚เฉฐ เจนเฉ‹เจฒ เจชเฉฐเจšเจฟเฉฐเจ— เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจคเจ•เจจเฉ€เจ• เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ UDP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเจพเจฒ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจชเจฐ เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจกเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจ—เจพเจฐเฉฐเจŸเฉ€เจธเจผเฉเจฆเจพ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจคเฉเจธเฉ€เจ‚ เจ•เฉฐเจชเจฟเจŠเจŸเจฐเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจซเจพเจˆเจฒเจพเจ‚ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ UDP เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจ•เจพเจฐเจจ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจฎเฉเจธเจผเจ•เจฒเจพเจ‚ เจนเฉ‹เจฃเจ—เฉ€เจ†เจ‚ เจ•เจฟ UDP เจ‡เฉฑเจ• เจ—เจพเจฐเฉฐเจŸเฉ€เจธเจผเฉเจฆเจพ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจŸเฉ€เจธเฉ€เจชเฉ€ เจฆเฉ‡ เจ‰เจฒเจŸ, เจ•เฉเจฐเจฎ เจตเจฟเฉฑเจš เจชเฉˆเจ•เฉ‡เจŸ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจฐเจฆเจพเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒเฅค

เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ—เจพเจฐเฉฐเจŸเฉ€เจธเจผเฉเจฆเจพ เจชเฉˆเจ•เฉ‡เจŸ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ, เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเฉ‡เจ…เจฐ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจœเฉ‹ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒเจคเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ UDP เจ‰เฉฑเจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจฎเฉˆเจ‚ เจคเฉเจฐเฉฐเจค เจจเฉ‹เจŸ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจตเฉฑเจ–-เจตเฉฑเจ– เจชเฉเจฐเจพเจˆเจตเฉ‡เจŸ เจจเฉˆเจŸเจตเจฐเจ•เจพเจ‚ เจตเจฟเฉฑเจš เจจเฉ‹เจกเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ TCP เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• TCP เจนเฉ‹เจฒ เจชเฉฐเจšเจฟเฉฐเจ— เจคเจ•เจจเฉ€เจ• เจนเฉˆ, เจชเจฐ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ NAT เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจธเจฎเจฐเจฅเจจ เจฆเฉ€ เจ•เจฎเฉ€ เจฆเฉ‡ เจ•เจพเจฐเจจ, เจ‡เจธเจจเฉ‚เฉฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจœเฉเฉœเจจ เจฆเจพ เจฎเฉเฉฑเจ– เจคเจฐเฉ€เจ•เจพ เจจเจนเฉ€เจ‚ เจฎเฉฐเจจเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ…เจœเจฟเจนเฉ‡ เจจเฉ‹เจก.

เจ‡เจธ เจฒเฉ‡เจ– เจฆเฉ‡ เจฌเจพเจ•เฉ€ เจนเจฟเฉฑเจธเฉ‡ เจฒเจˆ, เจฎเฉˆเจ‚ เจธเจฟเจฐเจซเจผ เจ—เจพเจฐเฉฐเจŸเฉ€เจธเจผเฉเจฆเจพ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ 'เจคเฉ‡ เจงเจฟเจ†เจจ เจ•เฉ‡เจ‚เจฆเจฐเจค เจ•เจฐเจพเจ‚เจ—เจพเฅค UDP เจนเฉ‹เจฒ เจชเฉฐเจšเจฟเฉฐเจ— เจคเจ•เจจเฉ€เจ• เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจตเจฐเจฃเจจ เจ…เจ—เจฒเฉ‡ เจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฒเฉ‹เฉœเจพเจ‚

  1. เจ‡เฉฑเจ• เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจซเฉ€เจกเจฌเฉˆเจ• เจตเจฟเจงเฉ€ (เจ…เจ–เฉŒเจคเฉ€ เจธเจ•เจพเจฐเจพเจคเจฎเจ• เจฎเจพเจจเจคเจพ) เจฆเฉเจ†เจฐเจพ เจฒเจพเจ—เฉ‚ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจชเฉˆเจ•เฉ‡เจŸ เจกเจฟเจฒเจฟเจตเจฐเฉ€
  2. เจตเฉฑเจกเฉ‡ เจกเฉ‡เจŸเจพ เจฆเฉ‡ เจ•เฉเจธเจผเจฒ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค, เจฏเจพเจจเฉ€. เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฌเฉ‡เจฒเฉ‹เฉœเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจฐเฉ€เจฒเฉ‡เจ… เจคเฉ‹เจ‚ เจฌเจšเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ
  3. เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจฐเฉฑเจฆ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ (เจ‡เฉฑเจ• "เจธเจผเฉเฉฑเจง" UDP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ€ เจฏเฉ‹เจ—เจคเจพ)
  4. เจนเจฐเฉ‡เจ• เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจฆเฉ‡ เจจเจพเจฒ, เจ•เจฎเจพเจ‚เจก เจฎเฉ‹เจก เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ
  5. เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจ‰เฉฑเจคเฉ‡ เจกเฉ‡เจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจฆเฉ€ เจฎเฉ‚เจฒ เจ‡เจ•เจพเจˆ เจ‡เฉฑเจ• เจธเฉเจจเฉ‡เจนเจพ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ

เจ‡เจน เจฒเฉ‹เฉœเจพเจ‚ เจตเฉฑเจกเฉ‡ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจญเจฐเฉ‹เจธเฉ‡เจฎเฉฐเจฆ เจกเฉ‡เจŸเจพ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ€เจ†เจ‚ เจฒเฉ‹เฉœเจพเจ‚ เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ เจœเจฟเจจเฉเจนเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจ†เจฐเจเจซเจธเฉ€ 908 ะธ เจ†เจฐเจเจซเจธเฉ€ 1151, เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจ‡เจธ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฎเจฟเจ†เจฐเจพเจ‚ 'เจคเฉ‡ เจญเจฐเฉ‹เจธเจพ เจ•เฉ€เจคเจพเฅค

เจ‡เจนเจจเจพเจ‚ เจฒเฉ‹เฉœเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจฒเจˆ, เจ†เจ“ TCP เจ…เจคเฉ‡ UDP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฆเฉ‹ เจจเฉˆเจŸเจตเจฐเจ• เจจเฉ‹เจกเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจกเฉ‡เจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจจเฉ‚เฉฐ เจตเฉ‡เจ–เฉ€เจเฅค เจฆเฉ‹เจจเจพเจ‚ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจŸ เจ—เฉเฉฐเจฎ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพเฅค
TCP เจ‰เฉฑเจคเฉ‡ เจ—เฉˆเจฐ-เจ‡เฉฐเจŸเจฐเฉˆเจ•เจŸเจฟเจต เจกเฉ‡เจŸเจพ เจฆเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ:.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจšเจฟเฉฑเจคเจฐ เจคเฉ‹เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ‡ เจจเฉเจ•เจธเจพเจจ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, TCP เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจตเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจนเจฟเฉฑเจธเฉ‡ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจชเฉเฉฑเจ› เจ•เฉ‡ เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจ•เจฐเฉ‡เจ—เจพเฅค
UDP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉเจ†เจฐเจพ เจกเจพเจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ:.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

UDP เจจเฉเจ•เจธเจพเจจ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฒเจˆ เจ•เฉ‹เจˆ เจ•เจฆเจฎ เจจเจนเฉ€เจ‚ เจšเฉเฉฑเจ•เจฆเจพ เจนเฉˆเฅค UDP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจตเจฟเฉฑเจš เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจ—เจฒเจคเฉ€เจ†เจ‚ เจฆเจพ เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ€ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐเฉ€ เจนเฉˆเฅค

TCP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจตเจฟเฉฑเจš เจ—เจฒเจคเฉ€ เจ–เฉ‹เจœ เจ‡เฉฑเจ• เจ…เฉฐเจค เจจเฉ‹เจก เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ•เจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจ•เจฐเจ•เฉ‡, เจ‰เจธ เจ•เจจเฉˆเจ•เจธเจผเจจ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจ•เฉ‡, เจนเจฐเฉ‡เจ• เจชเฉˆเจ•เฉ‡เจŸ เจนเฉˆเจกเจฐ เจตเจฟเฉฑเจš เจญเฉ‡เจœเฉ‡ เจ—เจ เจฌเจพเจˆเจŸเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹เจ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฐเจธเฉ€เจฆ เจจเฉฐเจฌเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจฐเจธเฉ€เจฆเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉ‚เจšเจฟเจค เจ•เจฐเจ•เฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ•เจพเจฐเจ—เฉเจœเจผเจพเจฐเฉ€ เจตเจฟเฉฑเจš เจธเฉเจงเจพเจฐ เจ•เจฐเจจ เจฒเจˆ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เฉฑเจ• เจฐเจธเฉ€เจฆ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจตเฉฑเจง เจ–เฉฐเจก เจญเฉ‡เจœเฉ‹), TCP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจ…เจ–เฉŒเจคเฉ€ เจŸเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจตเจฟเฉฐเจกเฉ‹ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ - เจกเฉ‡เจŸเจพ เจฆเฉ‡ เจฌเจพเจˆเจŸเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจœเฉ‹ เจ•เจฟ เจนเจฟเฉฑเจธเฉ‡ เจฆเฉ‡ เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจนเฉˆเฅค

TCP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฒเจˆ, เจตเฉ‡เจ–เฉ‹ เจ†เจฐเจเจซเจธเฉ€ 793, UDP เจคเฉ‹เจ‚ เจ†เจฐเจเจซเจธเฉ€ 768เจœเจฟเฉฑเจฅเฉ‡, เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค

เจ‰เจชเจฐเฉ‹เจ•เจค เจคเฉ‹เจ‚, เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉˆ เจ•เจฟ UDP เจ‰เฉฑเจคเฉ‡ เจ‡เฉฑเจ• เจญเจฐเฉ‹เจธเฉ‡เจฎเฉฐเจฆ เจธเฉเจจเฉ‡เจนเจพ เจกเจฟเจฒเจฟเจตเจฐเฉ€ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ (เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP), เจ‡เจน TCP เจฆเฉ‡ เจธเจฎเจพเจจ เจกเฉ‡เจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ…เจฐเจฅเจพเจค:

  • เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเฉ‹
  • เจ–เฉฐเจก เจจเฉฐเจฌเจฐเจฟเฉฐเจ— เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹
  • เจตเจฟเจธเจผเฉ‡เจธเจผ เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹
  • เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฅเฉเจฐเฉ‹เจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจธเจฐเจฒ เจตเจฟเฉฐเจกเฉ‹เจฟเฉฐเจ— เจตเจฟเจงเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฒเฉ‹เฉœ เจนเฉˆ:

  • เจ•เจจเฉˆเจ•เจธเจผเจจ เจฒเจˆ เจธเจฐเฉ‹เจค เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจฆเจพ เจธเฉฐเจ•เฉ‡เจค เจฆเจฟเจ“
  • เจ‡เฉฑเจ• เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเฉ‡ เจ…เฉฐเจค เจจเฉ‚เฉฐ เจธเฉฐเจ•เฉ‡เจค เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ เจธเฉเจจเฉ‡เจนเฉ‡ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจธเจŸเจฐเฉ€เจฎ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฃ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจธเจฐเฉ‹เจคเจพเจ‚ เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจ•เจฐเจจ เจฒเจˆ
  • เจ•เฉเจจเฉˆเจ•เจธเจผเจจ-เจตเจฟเจธเจผเฉ‡เจธเจผ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ "เจธเจผเฉเฉฑเจง" UDP เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจ…เจธเจฎเจฐเฉฑเจฅ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเจ“

เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจธเจฟเจฐเจฒเฉ‡เจ–

เจฏเจพเจฆ เจ•เจฐเฉ‹ เจ•เจฟ เจ‡เฉฑเจ• UDP เจกเฉ‡เจŸเจพเจ—เฉเจฐเจพเจฎ เจ‡เฉฑเจ• IP เจกเฉ‡เจŸเจพเจ—เฉเจฐเจพเจฎ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ UDP เจกเฉ‡เจŸเจพเจ—เฉเจฐเจพเจฎ เจตเจฟเฉฑเจš "เจฒเจชเฉ‡เจŸเจฟเจ†" เจ—เจฟเจ† เจนเฉˆเฅค
เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจธเจฟเจฐเจฒเฉ‡เจ– เจ‡เจจเจ•เฉˆเจชเจธเฉ‚เจฒเฉ‡เจธเจผเจจ:.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉ€ เจฌเจฃเจคเจฐ เจ•เจพเจซเจผเฉ€ เจธเจงเจพเจฐเจจ เจนเฉˆ:

.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

  • เจเฉฐเจกเฉ‡ - เจชเฉˆเจ•เฉ‡เจœ เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจซเจฒเฉˆเจ—
  • MessageType - เจ–เจพเจธ เจธเฉเจจเฉ‡เจนเจฟเจ†เจ‚ เจฆเฉ‡ เจฎเฉˆเจ‚เจฌเจฐ เจฌเจฃเจจ เจฒเจˆ เจ…เฉฑเจชเจธเจŸเจฐเฉ€เจฎ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจธเฉเจจเฉ‡เจนเจพ เจ•เจฟเจธเจฎ
  • เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจ†เจˆเจกเฉ€ - เจชเฉเจฐเจธเจพเจฐเจฃ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ†, เจชเฉเจฐเจพเจชเจคเจ•เจฐเจคเจพ เจฆเฉ‡ เจชเจคเฉ‡ เจ…เจคเฉ‡ เจชเฉ‹เจฐเจŸ เจฆเฉ‡ เจจเจพเจฒ, เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฟเจฒเฉฑเจ–เจฃ เจชเจ›เจพเจฃ เจ•เจฐเจฆเจพ เจนเฉˆ
  • PacketNumber - เจชเฉˆเจ•เฉ‡เจŸ เจจเฉฐเจฌเจฐ
  • เจตเจฟเจ•เจฒเจช - เจตเจพเจงเฉ‚ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจตเจฟเจ•เจฒเจชเฅค เจชเจนเจฟเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ‡ เจ†เจ•เจพเจฐ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจฃ เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ

เจเฉฐเจกเฉ‡ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ‡ เจ…เจจเฉเจธเจพเจฐ เจนเจจ:

  • FirstPacket - เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเจพ เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ
  • NoAsk - เจธเฉเจจเฉ‡เจนเฉ‡ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจฐเจธเฉ€เจฆ เจตเจฟเจงเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ
  • LastPacket - เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเจพ เจ†เจ–เจฐเฉ€ เจชเฉˆเจ•เฉ‡เจŸ
  • RequestForPacket - เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจชเฉˆเจ•เฉ‡เจŸ เจœเจพเจ‚ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€

เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ‡ เจ†เจฎ เจธเจฟเจงเจพเจ‚เจค

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจญเจฐเฉ‹เจธเฉ‡เจฎเฉฐเจฆ UDP เจฆเฉ‹ เจจเฉ‹เจกเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจ—เจพเจฐเฉฐเจŸเฉ€เจธเจผเฉเจฆเจพ เจธเฉฐเจฆเฉ‡เจธเจผ เจชเฉเจฐเจธเจพเจฐเจฃ 'เจคเฉ‡ เจ•เฉ‡เจ‚เจฆเฉเจฐเจฟเจค เจนเฉˆ, เจ‡เจธ เจฒเจˆ เจ‡เจน เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ, เจญเฉ‡เจœเจฃ เจตเจพเจฒเจพ เจซเจธเจŸเจชเฉˆเจ•เฉ‡เจŸ เจซเจฒเฉˆเจ— เจตเจพเจฒเจพ เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจฆเฉ‡ เจœเจตเจพเจฌ เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉ‹เจตเฉ‡เจ—เจพ เจ•เจฟ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจนเฉ‹ เจ—เจฟเจ† เจนเฉˆเฅค เจธเจพเจฐเฉ‡ เจœเจตเจพเจฌ เจชเฉˆเจ•เฉ‡เจŸ, เจœเจพเจ‚, เจฆเฉ‚เจœเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš, เจฎเจพเจจเจคเจพ เจชเฉˆเจ•เฉ‡เจŸ, เจนเจฎเฉ‡เจธเจผเจพ PacketNumber เจซเฉ€เจฒเจก เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจกเฉ‡ PacketNumber เจฎเฉเฉฑเจฒ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจตเฉฑเจง เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจญเฉ‡เจœเฉ‡ เจ—เจ เจชเจนเจฟเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจฒเจˆ เจตเจฟเจ•เจฒเจช เจ–เฉ‡เจคเจฐ เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเจพ เจ†เจ•เจพเจฐ เจนเฉˆเฅค

เจ‡เฉฑเจ• เจธเจฎเจพเจจ เจตเจฟเจงเฉ€ เจ‡เฉฑเจ• เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค LastPacket เจซเจฒเฉˆเจ— เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ‡ เจ†เจ–เจฐเฉ€ เจชเฉˆเจ•เฉ‡เจŸ 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจœเจตเจพเจฌ เจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเฉฑเจš, เจ†เจ–เจฐเฉ€ เจชเฉˆเจ•เฉ‡เจŸ + 1 เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† เจฆเจฐเจธเจพเจˆ เจ—เจˆ เจนเฉˆ, เจœเจฟเจธเจฆเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจชเจพเจธเฉ‡ เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ€ เจธเจซเจฒ เจกเจฟเจฒเฉ€เจตเจฐเฉ€เฅค
เจ•เจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจจเจพ เจ…เจคเฉ‡ เจธเจฎเจพเจชเจคเฉ€ เจšเจฟเฉฑเจคเจฐ:.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจœเจฆเฉ‹เจ‚ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจฟเจค เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจกเฉ‡เจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจกเจพเจŸเจพ เจชเฉˆเจ•เจŸเจพเจ‚ เจฆเฉ‡ เจฌเจฒเจพเจ•เจพเจ‚ เจตเจฟเฉฑเจš เจชเฉเจฐเจธเจพเจฐเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจนเจฐเฉ‡เจ• เจฌเจฒเจพเจ•, เจ†เจ–เจฐเฉ€ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจ•เฉ‡, เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเจฟเจธเจผเจšเจฟเจค เจธเฉฐเจ–เจฟเจ† เจฆเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค เจ‡เจน เจชเฉเจฐเจพเจชเจค/เจชเฉเจฐเจธเจพเจฐเจฟเจค เจตเจฟเฉฐเจกเฉ‹ เจ†เจ•เจพเจฐ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจนเฉˆเฅค เจกเจพเจŸเจพ เจฆเฉ‡ เจ†เจ–เจฐเฉ€ เจฌเจฒเจพเจ• เจตเจฟเฉฑเจš เจ˜เฉฑเจŸ เจชเฉˆเจ•เฉ‡เจŸ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจเฅค เจนเจฐเฉ‡เจ• เจฌเจฒเจพเจ• เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจญเฉ‡เจœเจฃ เจตเจพเจฒเจพ เจชเฉฑเจ– เจ‡เฉฑเจ• เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจœเจพเจ‚ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจกเจฟเจฒเฉ€เจตเจฐ เจ•เจฐเจจ เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจตเจพเจฌ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจชเฉเจฐเจพเจชเจค/เจชเฉเจฐเจธเจพเจฐเจฟเจค เจตเจฟเฉฐเจกเฉ‹ เจจเฉ‚เฉฐ เจ–เฉเฉฑเจฒเฉเจนเจพ เจ›เฉฑเจก เจ•เฉ‡เฅค เจฌเจฒเจพเจ• เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจชเฉเจฐเจพเจชเจค/เจชเฉเจฐเจธเจพเจฐเจฟเจค เจตเจฟเฉฐเจกเฉ‹ เจธเจผเจฟเจซเจŸ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจกเฉ‡เจŸเจพ เจฆเจพ เจ…เจ—เจฒเจพ เจฌเจฒเจพเจ• เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเจพ เจชเฉฑเจ– เจชเฉˆเจ•เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจนเจฐเฉ‡เจ• เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจ•เจฟ เจ•เฉ€ เจ‡เจน เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจตเจฟเฉฐเจกเฉ‹ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจชเฉˆเจ•เจŸ เจ…เจคเฉ‡ เจกเฉเจชเจฒเฉ€เจ•เฉ‡เจŸ เจœเฉ‹ เจตเจฟเฉฐเจกเฉ‹ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจ†เจ‰เจ‚เจฆเฉ‡ เจนเจจ, เจซเจฟเจฒเจŸเจฐ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ. เจ•เจฟเจ‰เจ‚เจ•เจฟ เจœเฉ‡เจ•เจฐ เจตเจฟเฉฐเจกเฉ‹ เจฆเจพ เจ†เจ•เจพเจฐ เจซเจฟเจ•เจธ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจ…เจคเฉ‡ เจชเฉเจฐเจพเจชเจคเจ•เจฐเจคเจพ เจ…เจคเฉ‡ เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจฒเจˆ เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเจพ เจนเฉˆ, เจคเจพเจ‚ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจฆเฉ‡ เจฌเจฟเจจเจพเจ‚ เจจเฉเจ•เจธเจพเจจ เจฆเฉ‡ เจกเจฟเจฒเฉ€เจตเจฐ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจตเจฟเฉฐเจกเฉ‹ เจจเฉ‚เฉฐ เจกเฉ‡เจŸเจพ เจฆเฉ‡ เจ…เจ—เจฒเฉ‡ เจฌเจฒเจพเจ• เจฆเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจธเจผเจฟเจซเจŸ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจกเจฟเจฒเจฟเจตเจฐเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจญเฉ‡เจœเจฟเจ†เฅค เจœเฉ‡เจ•เจฐ เจตเจฟเฉฐเจกเฉ‹ เจตเจฐเจ• เจŸเจพเจˆเจฎเจฐ เจฆเฉเจ†เจฐเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจธเจฎเฉ‡เจ‚ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจจเจนเฉ€เจ‚ เจญเจฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ‡เฉฑเจ• เจœเจพเจ‚เจš เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€ เจœเจฟเจธ 'เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจกเจฟเจฒเฉ€เจตเจฐ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจ เจ…เจคเฉ‡ เจฆเฉเจฌเจพเจฐเจพ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจญเฉ‡เจœเฉ€เจ†เจ‚ เจœเจพเจฃเจ—เฉ€เจ†เจ‚เฅค
เจฐเฉ€เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจกเจพเจ‡เจ—เจฐเจพเจฎ:.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจคเฉ€ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจŸเจพเจˆเจฎเจฐ

เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจจเจพ เจนเฉ‹เจฃ เจฆเฉ‡ เจ•เจˆ เจ•เจพเจฐเจจ เจนเจจเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเฉ‡เจ•เจฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจชเจพเจฐเจŸเฉ€ เจ†เจซเจผเจฒเจพเจˆเจจ เจนเฉˆเฅค เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจŸเจพเจˆเจฎเจ†เจŠเจŸ เจฆเฉเจ†เจฐเจพ เจฌเฉฐเจฆ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพเฅค เจญเจฐเฉ‹เจธเฉ‡เจฎเฉฐเจฆ UDP เจธเจฅเจพเจชเจจ เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจฆเฉ‹ เจŸเจพเจˆเจฎเจฐ เจตเจฐเจคเจฆเจพ เจนเฉˆเฅค เจชเจนเจฟเจฒเจพ, เจตเจฐเจ•เจฟเฉฐเจ— เจŸเจพเจˆเจฎเจฐ, เจฐเจฟเจฎเฉ‹เจŸ เจนเฉ‹เจธเจŸ เจคเฉ‹เจ‚ เจœเจตเจพเจฌ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจœเฉ‡ เจ‡เจน เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจชเจพเจธเฉ‡ เจซเจพเจ‡เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจ†เจ–เจฐเฉ€ เจญเฉ‡เจœเจฟเจ† เจ—เจฟเจ† เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉเจฌเจพเจฐเจพ เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจชเฉเจฐเจพเจชเจคเจ•เจฐเจคเจพ 'เจคเฉ‡ เจŸเจพเจˆเจฎเจฐ เจฆเฉ€ เจฎเจฟเจ†เจฆ เจชเฉเฉฑเจ— เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉเฉœ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจญเฉ‡เจœเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจจเฉ‹เจกเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจธเฉฐเจšเจพเจฐ เจฆเฉ€ เจ˜เจพเจŸ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเจจ เจฒเจˆ เจฆเฉ‚เจœเฉ‡ เจŸเจพเจˆเจฎเจฐ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ. เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจชเจพเจธเฉ‡ เจฒเจˆ, เจ‡เจน เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจŸเจพเจˆเจฎเจฐ เจฆเฉ€ เจฎเจฟเจ†เจฆ เจชเฉเฉฑเจ—เจฃ เจคเฉ‹เจ‚ เจคเฉเจฐเฉฐเจค เจฌเจพเจ…เจฆ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจฐเจฟเจฎเฉ‹เจŸ เจจเฉ‹เจก เจคเฉ‹เจ‚ เจœเจตเจพเจฌ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจจเจฟเจธเจผเจšเจฟเจค เจฎเจฟเจ†เจฆ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ•เฉ‹เจˆ เจœเจตเจพเจฌ เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเจฆเจพ, เจคเจพเจ‚ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเฉฐเจฆ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจฐเฉ‹เจค เจœเจพเจฐเฉ€ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจชเจพเจธเฉ‡ เจฒเจˆ, เจ•เฉฐเจฎ เจฆเฉ‡ เจŸเจพเจˆเจฎเจฐ เจฆเฉ‡ เจฆเฉ‹ เจตเจพเจฐ เจ–เจคเจฎ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจ•เจฒเฉ‹เจœเจผ เจŸเจพเจˆเจฎเจฐ เจšเจพเจฒเฉ‚ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ‡ เจจเฉเจ•เจธเจพเจจ เจคเฉ‹เจ‚ เจฌเจšเจพเจ… เจฒเจˆ เจ‡เจน เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจŸเจพเจˆเจฎเจฐ เจฆเฉ€ เจฎเจฟเจ†เจฆ เจชเฉเฉฑเจ— เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจตเฉ€ เจฌเฉฐเจฆ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจฐเฉ‹เจค เจœเจพเจฐเฉ€ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค

เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจธเจŸเฉ‡เจŸ เจกเจพเจ‡เจ—เฉเจฐเจพเจฎ

เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ‡ เจธเจฟเจงเจพเจ‚เจค เจ‡เฉฑเจ• เจธเฉ€เจฎเจฟเจค เจธเจŸเฉ‡เจŸ เจฎเจธเจผเฉ€เจจ เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจœเจฟเจธเจฆเฉ€ เจนเจฐเฉ‡เจ• เจ…เจตเจธเจฅเจพ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจฆเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจคเจฐเจ• เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค
เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจธเจŸเฉ‡เจŸ เจกเจพเจ‡เจ—เฉเจฐเจพเจฎ:

.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจฌเฉฐเจฆ - เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฐเจพเจœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจน เจ†เจŸเฉ‹เจฎเฉ‡เจŸเจจ เจฒเจˆ เจ‡เฉฑเจ• เจธเจผเฉเจฐเฉ‚เจ†เจค เจ…เจคเฉ‡ เจ…เฉฐเจค เจฌเจฟเฉฐเจฆเฉ‚ เจนเฉˆเฅค เจฐเจพเจœ เจฒเจˆ เจฌเฉฐเจฆ เจ‡เฉฑเจ• เจŸเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจฌเจฒเจพเจ• เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจœเฉ‹, เจ‡เฉฑเจ• เจ…เจธเจฟเฉฐเจ•เจฐเฉ‹เจจเจธ UDP เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ‰เจšเจฟเจค เจ•เฉเจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฒเจˆ เจ…เฉฑเจ—เฉ‡ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเจŸเฉ‡เจŸ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

FirstPacketSending - เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจธเจฅเจฟเจคเฉ€ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ†เจŠเจŸเจ—เฉ‹เจ‡เฉฐเจ— เจ•เจจเฉˆเจ•เจธเจผเจจ เจ‰เจฆเฉ‹เจ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจธเฉเจจเฉ‡เจนเจพ เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ†เจฎ เจธเฉฐเจฆเฉ‡เจธเจผเจพเจ‚ เจฒเจˆ เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจฌเจฟเจจเจพเจ‚ เจญเฉ‡เจœเจฃ เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจฆเฉ‡ เจธเฉเจจเฉ‡เจนเจฟเจ†เจ‚ เจฒเจˆ, เจ‡เจน เจ‡เฉฑเจ•เฉ‹ เจ‡เฉฑเจ• เจธเจฅเจฟเจคเฉ€ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจชเฉ‚เจฐเจพ เจธเฉเจจเฉ‡เจนเจพ เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจญเฉ‡เจœเจฃ เจฆเจพ เจšเฉฑเจ•เจฐ - เจธเฉฐเจฆเฉ‡เจธเจผ เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ‡ เจชเฉเจฐเจธเจพเจฐเจฃ เจฒเจˆ เจœเจผเจฎเฉ€เจจเฉ€ เจธเจฅเจฟเจคเฉ€เฅค

เจฐเจพเจœ เจคเฉ‹เจ‚ เจ‡เจธ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€ FirstPacketSending เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเจพ เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเฉ‡ เจœเจพเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เฉ€เจคเจพ เจ—เจฟเจ†เฅค เจ‡เจน เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจนเฉˆ เจ•เจฟ เจฐเฉ€เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจฒเจˆ เจธเจพเจฐเฉ€เจ†เจ‚ เจฎเจพเจจเจคเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจ†เจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ. เจ‡เจธ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจจเจฟเจ•เจฒเจฃเจพ เจฆเฉ‹ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจธเฉฐเจญเจต เจนเฉˆ - เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ€ เจธเจซเจฒ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš เจœเจพเจ‚ เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจค เจนเฉ‹เจฃ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจšเฅค

เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจ‡เจ† - เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเฉ‡ เจชเฉเจฐเจพเจชเจคเจ•เจฐเจคเจพ เจฒเจˆ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจธเจฅเจฟเจคเฉ€เฅค

เจ‡เจน เจชเฉเจฐเจธเจพเจฐเจฃ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจฆเฉ€ เจธเจผเฉเฉฑเจงเจคเจพ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ, เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจขเจพเจ‚เจšเฉ‡ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ€ เจฐเจธเฉ€เจฆ เจฆเฉ€ เจฐเจธเฉ€เจฆ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ.

เจ‡เฉฑเจ• เจธเฉเจจเฉ‡เจนเฉ‡ เจฒเจˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจชเฉˆเจ•เฉ‡เจŸ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ‡ เจธเจฌเฉ‚เจค เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจญเฉ‡เจœเจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจ‡เจน เจ‡เฉฑเจ•เฉ‹ เจ‡เฉฑเจ• เจฐเจพเจœ เจนเฉˆเฅค เจ…เจœเจฟเจนเฉ‡ เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเฉฐเจฆ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจ‡เจ•เฉฑเจ เฉ‡ เจนเฉ‹เจฃเจพ - เจธเฉเจจเฉ‡เจนเจพ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจฎเฉ‚เจฒ เจธเจฅเจฟเจคเฉ€เฅค

เจ‡เจน เจ…เจธเจฅเจพเจˆ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจฒเจˆ เจชเฉˆเจ•เฉ‡เจŸ เจฒเจฟเจ–เจฆเจพ เจนเฉˆ, เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ‡ เจจเฉเจ•เจธเจพเจจ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจ…เจคเฉ‡ เจชเฉ‚เจฐเฉ‡ เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ€ เจกเจฟเจฒเจฟเจตเจฐเฉ€ เจฒเจˆ เจฐเจธเฉ€เจฆ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจฎเฉเฉœ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจญเฉ‡เจœเจฆเจพ เจนเฉˆเฅค เจชเฉ‚เจฐเฉ‡ เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเฉ€ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจชเฉเจฐเจพเจชเจคเฉ€ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฐเจพเจœ เจตเจฟเฉฑเจš เจšเจฒเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจฎเฉเจ•เฉฐเจฎเจฒ, เจจเจนเฉ€เจ‚ เจคเจพเจ‚, เจ‡เฉฑเจ• เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจค เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจฎเฉเจ•เฉฐเจฎเจฒ - เจชเฉ‚เจฐเฉ‡ เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเฉ€ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจชเฉเจฐเจพเจชเจคเฉ€ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเฉฐเจฆ เจ•เจฐเจจเจพเฅค

เจ‡เจน เจธเจฅเจฟเจคเฉ€ เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเฉ‡ เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจฒเจˆ เจ…เจคเฉ‡ เจ‰เจธ เจ•เฉ‡เจธ เจฒเจˆ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจฆเฉ‡ เจฐเจธเจคเฉ‡ เจตเจฟเฉฑเจš เจธเฉฐเจฆเฉ‡เจธเจผ เจฆเฉ€ เจกเจฟเจฒเจฟเจตเจฐเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจ–เจคเจฎ เจนเฉ‹ เจ—เจˆ เจธเฉ€เฅค เจ‡เจน เจ…เจตเจธเจฅเจพ เจ‡เฉฑเจ• เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจคเฉ€ เจฆเฉเจ†เจฐเจพ เจฌเจพเจนเจฐ เจ† เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจชเจฐ เจ•เจจเฉˆเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจฌเฉฐเจฆ เจฎเฉฐเจจเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ‡. เจธเฉฐเจšเจพเจฐ เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจฏเฉ‚เจจเจฟเจŸ

เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— 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 เจฐเจพเจœ เจฒเจˆ เจ‡เฉฑเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ:

.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเจพ เจธเจพเจฐเจพ เจคเจฐเจ• เจ‰เจชเจฐเฉ‹เจ•เจค เจชเฉ‡เจธเจผ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ•เจฒเจพเจธเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ‡เฉฑเจ• เจธเจนเจพเจ‡เจ• เจ•เจฒเจพเจธ เจฆเฉ‡ เจจเจพเจฒ เจœเฉ‹ เจธเจฅเจฟเจฐ เจตเจฟเจงเฉ€เจ†เจ‚ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ, เจ•เจจเฉˆเจ•เจธเจผเจจ เจฐเจฟเจ•เจพเจฐเจก เจคเฉ‹เจ‚ ReliableUdp เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเจพ เจจเจฟเจฐเจฎเจพเจฃ เจ•เจฐเจจเจพเฅค

เจ…เฉฑเจ—เฉ‡, เจ…เจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเจฟเจšเจพเจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค

DisposeByTimeout เจขเฉฐเจ—

DisposeByTimeout เจตเจฟเจงเฉ€ เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจค เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เจจเฉˆเจ•เจธเจผเจจ เจธเจฐเฉ‹เจคเจพเจ‚ เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจ•เจฐเจจ เจ…เจคเฉ‡ เจธเจซเจฒ/เจ…เจธเจซเจฒ เจธเฉฐเจฆเฉ‡เจธเจผ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ‡ เจธเฉฐเจ•เฉ‡เจค เจฆเฉ‡เจฃ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆเฅค
ReliableUdpState.DisposeByTimeout:

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

เจ‡เจน เจธเจฟเจฐเจซ เจฐเจพเจœ เจตเจฟเฉฑเจš เจ“เจตเจฐเจฐเจพเจˆเจก เจนเฉˆ เจฎเฉเจ•เฉฐเจฎเจฒ.
เจชเฉ‚เจฐเจพ เจนเฉ‹เจ‡เจ†เฅคDisposeByTimeout:

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

เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเจงเฉ€

ProcessPackets เจตเจฟเจงเฉ€ เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจœ เจœเจพเจ‚ เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจฆเฉ€ เจตเจพเจงเฉ‚ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆเฅค เจธเจฟเฉฑเจงเฉ‡ เจœเจพเจ‚ เจชเฉˆเจ•เฉ‡เจŸ เจตเฉ‡เจŸ เจŸเจพเจˆเจฎเจฐ เจฆเฉเจ†เจฐเจพ เจ•เจพเจฒ เจ•เฉ€เจคเฉ€ เจ—เจˆเฅค

เจธเจฎเจฐเฉฑเจฅ เจ‡เจ•เฉฑเจ เฉ‡ เจนเฉ‹เจฃเจพ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจ“เจตเจฐเจฐเจพเจˆเจก เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจ…เจคเฉ‡ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจ…เจคเฉ‡ เจฐเจพเจœ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒ เจ•เจฐเจจ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆ เจฎเฉเจ•เฉฐเจฎเจฒ, เจ†เจ–เจฐเฉ€ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจธเจซเจฒ เจœเจพเจ‚เจš เจชเจพเจธ เจ•เจฐเจจ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš
เจ…เจธเฉˆเจ‚เจฌเจฒเจฟเฉฐเจ—.เจชเฉเจฐเฉ‹เจธเฉˆเจธ เจชเฉˆเจ•เฉ‡เจŸ:

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

เจธเจฎเจฐเฉฑเจฅ เจญเฉ‡เจœเจฃ เจฆเจพ เจšเฉฑเจ•เจฐ เจ‡เจธ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจŸเจพเจˆเจฎเจฐ 'เจคเฉ‡ เจฌเฉเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ†เจ–เจฐเฉ€ เจธเฉฐเจฆเฉ‡เจธเจผ เจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจญเฉ‡เจœเจฃ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจ•เจจเฉˆเจ•เจธเจผเจจ เจ•เจฒเฉ‹เจœเจผ เจŸเจพเจˆเจฎเจฐ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเจจ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆเฅค
SendingCycle.ProcessPackets:

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

เจธเจฎเจฐเฉฑเจฅ เจฎเฉเจ•เฉฐเจฎเจฒ เจตเจฟเจงเฉ€ เจšเฉฑเจฒ เจฐเจนเฉ‡ เจŸเจพเจˆเจฎเจฐ เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡ เจ—เจพเจนเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจธเฉเจจเฉ‡เจนเจพ เจญเฉ‡เจœเจฆเฉ€ เจนเฉˆเฅค
เจฎเฉเจ•เฉฐเจฎเจฒเฅคเจชเฉเจฐเฉ‹เจธเฉˆเจธ เจชเฉˆเจ•เฉ‡เจŸ:

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

เจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเจงเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹

เจธเจฎเจฐเฉฑเจฅ เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจ‡เจ† เจตเจฟเจงเฉ€ เจฆเจพ เจฎเฉเฉฑเจ– เจ•เฉฐเจฎ เจ‡เจน เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ€ เจชเจนเจฟเจฒเจพ เจธเฉเจจเฉ‡เจนเจพ เจชเฉˆเจ•เฉ‡เจŸ เจ…เจธเจฒ เจตเจฟเฉฑเจš เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ 'เจคเฉ‡ เจ†เจ‡เจ† เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจน เจตเฉ€ เจ•เจฟ เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจชเฉˆเจ•เฉ‡เจŸ เจตเจพเจฒเฉ‡ เจธเฉฐเจฆเฉ‡เจธเจผ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ เจนเฉˆเฅค
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 เจตเจฟเจงเฉ€ เจตเจฟเฉฑเจš, เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เฉฑเจ• เจธเฉฐเจฆเฉ‡เจธเจผ เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจ เจฆเจพ เจฎเฉเฉฑเจ– เจ•เฉฐเจฎ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค
เจ…เจธเฉˆเจ‚เจฌเจฒเจฟเฉฐเจ—เฅค เจชเฉเจฐเจพเจชเจค เจชเฉˆเจ•เฉ‡เจŸ:

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

เจธเจฎเจฐเฉฑเจฅ เจฎเฉเจ•เฉฐเจฎเจฒ เจตเจฟเจงเฉ€ เจฆเจพ เจ‡เฉฑเจ•เฉ‹ เจ‡เฉฑเจ• เจ•เฉฐเจฎ เจธเฉเจจเฉ‡เจนเฉ‡ เจฆเฉ€ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ€ เจฎเฉเฉœ-เจธเจตเฉ€เจ•เฉเจฐเจฟเจคเฉ€ เจญเฉ‡เจœเจฃเจพ เจนเฉˆเฅค
เจชเฉ‚เจฐเจพ เจนเฉ‹เจ‡เจ†เฅคเจชเฉˆเจ•เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹:

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

เจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเจงเฉ€ เจญเฉ‡เจœเฉ‹

เจธเจฎเจฐเฉฑเจฅ FirstPacketSending เจ‡เจน เจตเจฟเจงเฉ€ เจกเฉ‡เจŸเจพ เจฆเจพ เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเจฆเฉ€ เจนเฉˆ, เจœเจพเจ‚ เจœเฉ‡เจ•เจฐ เจธเฉฐเจฆเฉ‡เจธเจผ เจจเฉ‚เฉฐ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจคเจพเจ‚ เจชเฉ‚เจฐเจพ เจธเฉเจจเฉ‡เจนเจพเฅค
FirstPacketSending.SendPacket:

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

เจธเจฎเจฐเฉฑเจฅ เจญเฉ‡เจœเจฃ เจฆเจพ เจšเฉฑเจ•เจฐ เจ‡เจธ เจตเจฟเจงเฉ€ เจตเจฟเฉฑเจš, เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค
SendingCycle.SendPacket:

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

เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ‡. เจ•เจจเฉˆเจ•เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃเจพ เจ…เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ

เจนเฉเจฃ เจœเจฆเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจฐเจพเจœเจพเจ‚ เจ…เจคเฉ‡ เจฐเจพเจœเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจญเจพเจฒเจฃ เจฒเจˆ เจตเจฐเจคเฉ‡ เจœเจพเจฃ เจตเจพเจฒเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เจฟเจ† เจนเฉˆ, เจ†เจ“ เจ•เฉเจ เจ‰เจฆเจพเจนเจฐเจจเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉ‹เฉœเฉ€เจ เจ•เจฟ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฅเฉ‹เฉœเจพ เจนเฉ‹เจฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
เจธเจงเจพเจฐเจฃ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจชเฉเจฐเจธเจพเจฐเจฃ เจšเจฟเฉฑเจคเจฐ:.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจฐเจšเจจเจพ เจฌเจพเจฐเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ‹ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฐเจฟเจ•เจพเจฐเจก เจ•เจจเฉˆเจ•เจŸ เจ•เจฐเจจ เจ…เจคเฉ‡ เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเจฃ เจฒเจˆเฅค เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจนเจฎเฉ‡เจธเจผเจพ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉเจ†เจฐเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเฉ‹ เจญเฉ‡เจœเฉ‹ เจธเฉเจจเฉ‡เจนเจพ API เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ…เฉฑเจ—เฉ‡, เจŸเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจฌเจฒเจพเจ• เจฆเฉ€ เจธเจŸเจพเจฐเจŸ เจŸเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจฌเฉเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจœเฉ‹ เจจเจตเฉ‡เจ‚ เจธเฉฐเจฆเฉ‡เจธเจผ เจฒเจˆ เจกเฉ‡เจŸเจพ เจฆเจพ เจธเฉฐเจšเจพเจฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
เจ‡เฉฑเจ• เจ†เจŠเจŸเจ—เฉ‹เจ‡เฉฐเจ— เจ•เจจเฉˆเจ•เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃเจพ:

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

เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเจฃเจพ (FirstPacketSending State):

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

เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจญเฉ‡เจœเจฃ เจตเจพเจฒเจพ เจฐเจพเจœ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจญเฉ‡เจœเจฃ เจฆเจพ เจšเฉฑเจ•เจฐ - เจชเฉˆเจ•เฉ‡เจœ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเฉ‹.
เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเจพ เจชเฉฑเจ–, EndReceive เจตเจฟเจงเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡, เจญเฉ‡เจœเจฟเจ† เจ—เจฟเจ† เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเจพ เจนเฉˆ, เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฐเจฟเจ•เจพเจฐเจก เจ…เจคเฉ‡ เจ‡เจธ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ, เจ‡เฉฑเจ• เจชเฉ‚เจฐเจต-เจชเจพเจฐเจธ เจ•เฉ€เจคเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ– เจฆเฉ‡ เจจเจพเจฒ, เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจฒเจˆ เจฐเจพเจœ เจฆเฉ‡ เจฐเจฟเจธเฉ€เจตเจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เจฐเจฆเจพ เจนเฉˆ เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจนเฉ‹เจ‡เจ†
เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจชเจพเจธเฉ‡ เจ‡เฉฑเจ• เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเจฃเจพเจ‰เจฃเจพ:

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 เจฆเจพ เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเจฟเฉฑเจธเจพ เจนเฉˆเฅค เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ‹ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจตเจฟเจšเจ•เจพเจฐเจฒเจพ เจจเฉ‹เจก เจซเฉ‡เจฒเฉเจน เจนเฉ‹ เจ—เจฟเจ† เจ…เจคเฉ‡ เจฆเฉ‹เจตเจพเจ‚ เจฆเจฟเจธเจผเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจกเจฟเจฒเจฟเจตเจฐเฉ€ เจ…เจธเฉฐเจญเจต เจนเฉ‹ เจ—เจˆเฅค
เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจคเฉ€ เจฆเฉเจ†เจฐเจพ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเฉฐเจฆ เจ•เจฐเจจ เจฒเจˆ เจšเจฟเฉฑเจคเจฐ:.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจšเจฟเฉฑเจคเจฐ เจคเฉ‹เจ‚ เจฆเฉ‡เจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจฆเจพ เจ•เฉฐเจฎ เจŸเจพเจˆเจฎเจฐ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจฌเจฒเจพเจ• เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฃ เจคเฉ‹เจ‚ เจคเฉเจฐเฉฐเจค เจฌเจพเจ…เจฆ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจฐเจพเจœ เจฆเฉ‡ SendPacket เจตเจฟเจงเฉ€ เจตเจฟเฉฑเจš เจตเจพเจชเจฐเจฆเจพ เจนเฉˆ เจญเฉ‡เจœเจฃ เจฆเจพ เจšเฉฑเจ•เจฐ.
เจ•เฉฐเจฎ เจŸเจพเจˆเจฎเจฐ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเจจเจพ (SendingCycle เจธเจŸเฉ‡เจŸ):

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

เจœเจฆเฉ‹เจ‚ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเจฃเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจŸเจพเจˆเจฎเจฐ เจชเฉ€เจฐเฉ€เจ…เจก เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจชเฉ‚เจฐเจต-เจจเจฟเจฐเจงเจพเจฐเจค เจธเจผเจพเจฐเจŸเจŸเจพเจˆเจฎเจฐ เจชเฉ€เจฐเฉ€เจ…เจก 5 เจธเจ•เจฟเฉฐเจŸ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจš, เจ‡เจธ เจจเฉ‚เฉฐ 1,5 เจธเจ•เจฟเฉฐเจŸ 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค

เจ‡เฉฑเจ• เจ‡เจจเจ•เจฎเจฟเฉฐเจ— เจ•เจจเฉˆเจ•เจธเจผเจจ เจฒเจˆ, เจŸเจพเจˆเจฎเจฐ เจ†เจ–เจฐเฉ€ เจ‡เจจเจ•เจฎเจฟเฉฐเจ— เจกเฉ‡เจŸเจพ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจน เจฐเจพเจœ เจฆเฉ‡ เจฐเฉ€เจธเฉ€เจต เจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเจงเฉ€ เจตเจฟเฉฑเจš เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ‡เจ•เฉฑเจ เฉ‡ เจนเฉ‹เจฃเจพ
เจตเจฐเจ• เจŸเจพเจˆเจฎเจฐ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเจจเจพ (เจ…เจธเฉˆเจ‚เจฌเจฒเจฟเฉฐเจ— เจธเจŸเฉ‡เจŸ):

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

เจตเจฐเจ•เจฟเฉฐเจ— เจŸเจพเจˆเจฎเจฐ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ 'เจคเฉ‡ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจชเฉˆเจ•เฉ‡เจŸ เจจเจนเฉ€เจ‚ เจ†เจเฅค เจŸเจพเจˆเจฎเจฐ เจฌเฉฐเจฆ เจนเฉ‹ เจ—เจฟเจ† เจ…เจคเฉ‡ ProcessPackets เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจฌเฉเจฒเจพเจ‡เจ† เจ—เจฟเจ†, เจœเจฟเฉฑเจฅเฉ‡ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸ เจฒเฉฑเจญเฉ‡ เจ—เจ เจธเจจ เจ…เจคเฉ‡ เจชเจนเจฟเจฒเฉ€ เจตเจพเจฐ เจฎเฉเฉœ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจญเฉ‡เจœเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจธเจจเฅค
เจฎเฉเฉœ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจญเฉ‡เจœเจฃเจพ (เจ…เจธเฉˆเจ‚เจฌเจฒเจฟเฉฐเจ— เจธเจŸเฉ‡เจŸ):

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

TimerSecondTry เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจจเฉ‚เฉฐ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจ‡เจน เจธเฉฑเจš เจนเฉˆ,. เจ‡เจน เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจŸเจพเจˆเจฎเจฐ เจจเฉ‚เฉฐ เจฎเฉเฉœ เจšเจพเจฒเฉ‚ เจ•เจฐเจจ เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆเฅค

เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจชเจพเจธเฉ‡, เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเจพ เจŸเจพเจˆเจฎเจฐ เจตเฉ€ เจšเจพเจฒเฉ‚ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ†เจ–เจฐเฉ€ เจญเฉ‡เจœเจฟเจ† เจ—เจฟเจ† เจชเฉˆเจ•เฉ‡เจŸ เจฎเฉเฉœ เจญเฉ‡เจœเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค
เจ•เจจเฉˆเจ•เจธเจผเจจ เจฌเฉฐเจฆ เจŸเจพเจˆเจฎเจฐ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐเจจเจพ (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);
  }
}

เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจกเฉ‚เฉฐเจ˜เฉ‡. เจกเจพเจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจจเฉ‚เฉฐ เจฌเจนเจพเจฒ เจ•เฉ€เจคเจพ เจœเจพ เจฐเจฟเจนเจพ เจนเฉˆ

เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ‡ เจจเฉเจ•เจธเจพเจจ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจŸเฉเจฐเจพเจ‚เจธเจฎเจฟเจธเจผเจจ เจฐเจฟเจ•เจตเจฐเฉ€ เจกเจพเจ‡เจ—เจฐเจพเจฎ:.Net เจฒเจˆ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— Udp เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจค เจนเฉ‹เจฃ 'เจคเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเจจ เจฌเจพเจฐเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจšเจฐเจšเจพ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจนเฉˆ, เจœเจฆเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจŸเจพเจˆเจฎเจฐ เจฆเฉ€ เจฎเจฟเจ†เจฆ เจชเฉเฉฑเจ— เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจชเฉเจฐเจพเจชเจคเจ•เจฐเจคเจพ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ‡เจ—เจพเฅค เจชเฉˆเจ•เฉ‡เจŸ เจ—เฉเจ†เจšเจฃ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ‰เจจเฉเจนเจพเจ‚ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€ เจœเฉ‹ เจชเฉเจฐเจพเจชเจคเจ•เจฐเจคเจพ เจคเฉฑเจ• เจจเจนเฉ€เจ‚ เจชเจนเฉเฉฐเจšเฉ‡เฅค เจ‡เจน เจจเฉฐเจฌเจฐ เจ‡เฉฑเจ• เจ–เจพเจธ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฆเฉ‡ LostPackets เจเจฐเฉ‡ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจฎเฉเฉœ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจญเฉ‡เจœเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค
เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจจเฉ‚เฉฐ เจฎเฉเฉœ เจกเจฟเจฒเฉ€เจตเจฐ เจ•เจฐเจจ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจญเฉ‡เจœเจฃเจพ (เจ…เจธเฉˆเจ‚เจฌเจฒเจฟเฉฐเจ— เจธเจŸเฉ‡เจŸ):

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

เจญเฉ‡เจœเจฃ เจตเจพเจฒเจพ เจฎเฉเฉœ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฆเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเฉ‡เจ—เจพ เจ…เจคเฉ‡ เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเฉ‡เจ—เจพเฅค เจ‡เจน เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ เจ•เจฟ เจ‡เจธ เจธเจฎเฉ‡เจ‚ เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจจเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฌเฉฐเจฆ เจŸเจพเจˆเจฎเจฐ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจนเฉˆ เจ…เจคเฉ‡, เจœเจฆเฉ‹เจ‚ เจ•เฉ‹เจˆ เจฌเฉ‡เจจเจคเฉ€ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจฐเฉ€เจธเฉˆเจŸ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค
เจ—เฉเฉฐเจฎ เจนเฉ‹เจ เจชเฉˆเจ•เฉ‡เจŸ เจฎเฉเฉœ เจญเฉ‡เจœเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจ (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)

เจธเฉเจจเฉ‡เจนเจพ เจญเฉ‡เจœเจฃ เจฆเจพ เจจเจคเฉ€เจœเจพ เจธเจนเฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ - เจœเฉ‡เจ•เจฐ เจธเฉเจจเฉ‡เจนเจพ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจชเฉเจฐเจพเจชเจคเจ•เจฐเจคเจพ เจคเฉฑเจ• เจชเจนเฉเฉฐเจšเจฟเจ† เจ…เจคเฉ‡ เจ—เจฒเจค - เจœเฉ‡เจ•เจฐ เจ•เจจเฉˆเจ•เจธเจผเจจ เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจคเฉ€ เจฆเฉเจ†เจฐเจพ เจฌเฉฐเจฆ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€:

public bool EndSendMessage(IAsyncResult asyncResult)

เจธเจฟเฉฑเจŸเจพ

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเจš เจฌเจนเฉเจค เจ•เฉเจ เจตเจฐเจฃเจจ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ. เจฅเฉเจฐเฉˆเจก เจฎเฉˆเจšเจฟเฉฐเจ— เจตเจฟเจงเฉ€, เจ…เจชเจตเจพเจฆ เจ…เจคเฉ‡ เจ—เจฒเจคเฉ€ เจนเฉˆเจ‚เจกเจฒเจฟเฉฐเจ—, เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ เจธเฉฐเจฆเฉ‡เจธเจผ เจญเฉ‡เจœเจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพเฅค เจชเจฐ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเจพ เจฎเฉ‚เจฒ, เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฒเจˆ เจคเจฐเจ• เจฆเจพ เจตเฉ‡เจฐเจตเจพ, เจ‡เฉฑเจ• เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฅเจพเจชเจค เจ•เจฐเจจเจพ, เจ…เจคเฉ‡ เจธเจฎเจพเจ‚ เจธเจฎเจพเจชเจคเฉ€ เจจเฉ‚เฉฐ เจธเฉฐเจญเจพเจฒเจฃเจพ, เจคเฉเจนเจพเจกเฉ‡ เจฒเจˆ เจธเจชเฉฑเจธเจผเจŸ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเจพ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจธเฉฐเจธเจ•เจฐเจฃ เจชเจนเจฟเจฒเจพเจ‚ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจฒเฉ‹เฉœเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจซเจผเฉ€ เจฎเจœเจผเจฌเฉ‚เจค โ€‹โ€‹เจ…เจคเฉ‡ เจฒเจšเจ•เจฆเจพเจฐ เจนเฉˆเฅค เจชเจฐ เจฎเฉˆเจ‚ เจ‡เจน เจœเฉ‹เฉœเจจเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจตเจฐเจฃเจฟเจค เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจจเฉ‚เฉฐ เจธเฉเจงเจพเจฐเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ. เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฅเฉเจฐเฉ‹เจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจฃ เจ…เจคเฉ‡ เจŸเจพเจˆเจฎเจฐ เจชเฉ€เจฐเฉ€เจ…เจกเจพเจ‚ เจจเฉ‚เฉฐ เจ—เจคเฉ€เจธเจผเฉ€เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃ เจฒเจˆ, เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจตเจฟเฉฑเจš เจธเจฒเจพเจˆเจกเจฟเฉฐเจ— เจตเจฟเฉฐเจกเฉ‹ เจ…เจคเฉ‡ RTT เจตเจฐเจ—เฉ€เจ†เจ‚ เจตเจฟเจงเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เจน เจ•เจจเฉˆเจ•เจธเจผเจจ เจจเฉ‹เจกเจพเจ‚ เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ MTU เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจตเจฟเจงเฉ€ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฒเจˆ เจตเฉ€ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉ‹เจตเฉ‡เจ—เจพ (เจชเจฐ เจ•เฉ‡เจตเจฒ เจคเจพเจ‚ เจนเฉ€ เจœเฉ‡เจ•เจฐ เจตเฉฑเจกเฉ‡ เจธเฉเจจเฉ‡เจนเฉ‡ เจญเฉ‡เจœเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจ) .

เจคเฉเจนเจพเจกเฉ‡ เจงเจฟเจ†เจจ เจฒเจˆ เจคเฉเจนเจพเจกเจพ เจงเฉฐเจจเจตเจพเจฆ, เจฎเฉˆเจ‚ เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐเจฆเจพ เจนเจพเจ‚.

PS เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจœเฉ‹ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจจ เจœเจพเจ‚ เจธเจฟเจฐเจซ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจจ, GitHube 'เจคเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเจพ เจฒเจฟเฉฐเจ•:
เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— UDP เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ

เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจฒเจฟเฉฐเจ• เจ…เจคเฉ‡ เจฒเฉ‡เจ–

  1. TCP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเจฟเจฐเจงเจพเจฐเจจ: เจ…เฉฐเจ—เจฐเฉ‡เจœเจผเฉ€ เจตเจฟเฉฑเจš ะธ เจฐเฉ‚เจธเฉ€ เจตเจฟเฉฑเจš
  2. UDP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจจเจฟเจฐเจงเจพเจฐเจจ: เจ…เฉฐเจ—เจฐเฉ‡เจœเจผเฉ€ เจตเจฟเฉฑเจš ะธ เจฐเฉ‚เจธเฉ€ เจตเจฟเฉฑเจš
  3. RUDP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเฉ€ เจšเจฐเจšเจพ: เจกเจฐเจพเจซเจŸ-ietf-sigtran-เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ—-udp-00
  4. เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจกเจพเจŸเจพ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ: เจ†เจฐเจเจซเจธเฉ€ 908 ะธ เจ†เจฐเจเจซเจธเฉ€ 1151
  5. UDP เจ‰เฉฑเจคเฉ‡ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจ…เจฎเจฒ: .NET เจ…เจคเฉ‡ UDP เจจเจพเจฒ เจ†เจชเจฃเฉ‡ เจจเฉˆเฉฑเจŸเจตเจฐเจ•เจฟเฉฐเจ— เจฆเจพ เจชเฉ‚เจฐเจพ เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจฒเจ“
  6. NAT เจŸเจฐเจพเจตเจฐเจธเจฒ เจตเจฟเจงเฉ€ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจ เจตเจพเจฒเจพ เจฒเฉ‡เจ–: เจชเฉ€เจ…เจฐ-เจŸเฉ‚-เจชเฉ€เจ…เจฐ เจธเฉฐเจšเจพเจฐ เจธเจพเจฐเฉ‡ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจเจกเจฐเฉˆเฉฑเจธ เจ…เจจเฉเจตเจพเจฆเจ•เจพเจ‚ เจตเจฟเฉฑเจš
  7. เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจฎเจพเจกเจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ: CLR เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจฎเจพเจกเจฒ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ ะธ IAsyncResult เจกเจฟเจœเจผเจพเจˆเจจ เจชเฉˆเจŸเจฐเจจ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจนเฉˆ
  8. เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจฎเจพเจกเจฒ เจจเฉ‚เฉฐ เจŸเจพเจธเจ•-เจ…เจงเจพเจฐเจฟเจค เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ เจชเฉˆเจŸเจฐเจจ (TAP เจตเจฟเฉฑเจš APM) เจตเจฟเฉฑเจš เจชเฉ‹เจฐเจŸ เจ•เจฐเจจเจพ:
    TPL เจ…เจคเฉ‡ เจชเจฐเฉฐเจชเจฐเจพเจ—เจค .NET เจ…เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจธ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—
    เจนเฉ‹เจฐ เจ…เจธเจฟเฉฐเจ•เจฐเฉ‹เจจเจธ เจชเฉˆเจŸเจฐเจจเจพเจ‚ เจ…เจคเฉ‡ เจ•เจฟเจธเจฎเจพเจ‚ เจจเจพเจฒ เจ‡เฉฐเจŸเจฐเฉ‹เจช เจ•เจฐเฉ‹

เจ…เฉฑเจชเจกเฉ‡เจŸ: เจงเฉฐเจจเจตเจพเจฆ mayorovp ะธ sidristij เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เฉฐเจฎ เจœเฉ‹เฉœเจจ เจฆเฉ‡ เจตเจฟเจšเจพเจฐ เจฒเจˆเฅค เจชเฉเจฐเจพเจฃเฉ‡ เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎเจพเจ‚ เจจเจพเจฒ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจฆเฉ€ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจฆเฉ€ เจ‰เจฒเฉฐเจ˜เจฃเจพ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจšเฉŒเจฅเจพ เจซเจฐเฉ‡เจฎเจตเจฐเจ• XP เจ…เจคเฉ‡ 4 เจธเจฐเจตเจฐ เจฆเฉ‹เจตเจพเจ‚ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹