เดเดจเตเดฑเตผเดจเตเดฑเตเดฑเต เดตเดณเดฐเตเดเตเดเดพเดฒเด เดฎเตเดฎเตเดชเต เดฎเดพเดฑเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดจเตเดฑเตผเดจเตเดฑเตเดฑเดฟเดจเตเดฑเต เดชเตเดฐเดงเดพเดจ เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเตเดเดณเดฟเตฝ เดเดจเตเดจเต - เดฏเตเดกเดฟเดชเดฟ เดกเดพเดฑเตเดฑเดพเดเตเดฐเดพเดฎเตเดเดณเตเด เดชเตเดฐเดเตเดทเตเดชเดฃเดเตเดเดณเตเด เดจเตฝเดเตเดจเตเดจเดคเดฟเดจเต เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดจเตเดกเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ "เดชเดฟเดฏเตผ-เดเต-เดชเดฟเดฏเตผ" เดเดฃเดเตเดทเดจเตเดเตพ เดจเตฝเดเดพเดจเตเด เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เดฒเดณเดฟเดคเดฎเดพเดฏ เดฐเตเดชเดเตฝเดชเตเดชเดจ เดเดพเดฐเดฃเด, เด เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเต เดฎเตเดฎเตเดชเต เดเดธเตเดคเตเดฐเดฃเด เดเตเดฏเตเดฏเดพเดคเตเดค เดจเดฟเดฐเดตเดงเดฟ เดเดชเดฏเตเดเดเตเดเดณเตเดฃเตเดเต, เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เดชเตเดฐเดพเดฏเตเดฎเดเตพ, เดเตเดฏเดพเดฐเดฃเตเดเดฟ เดกเตเดฒเดฟเดตเดฑเดฟ เด
เดญเดพเดตเด เดชเตเดฒเต, เดเดตเดฟเดเตเดฏเตเด เด
เดชเตเดฐเดคเตเดฏเดเตเดทเดฎเดพเดฏเดฟเดเตเดเดฟเดฒเตเดฒ. UDP-เดฏเดฟเตฝ เดเตเดฏเดพเดฐเดฃเตเดเตเดกเต เดกเตเดฒเดฟเดตเดฑเดฟ เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเต เด เดฒเตเดเดจเด เดตเดฟเดตเดฐเดฟเดเตเดเตเดจเตเดจเต.
เดเดณเตเดณเดเดเตเดเด:
DisposeByTimeout เดฐเตเดคเดฟ ProcessPackets เดฐเตเดคเดฟ เดฑเดฟเดธเตเดตเต เดชเดพเดเตเดเดฑเตเดฑเต เดฐเตเดคเดฟ เดชเดพเดเตเดเดฑเตเดฑเต เดฐเตเดคเดฟ เด เดฏเดฏเตเดเตเดเตเด
เดเตปเดเตเดฐเดฟ
เดเตปเดฑเตผเดจเตเดฑเตเดฑเดฟเดจเตเดฑเต เดฏเดฅเดพเตผเดคเตเดฅ เดเตผเดเตเดเดฟเดเตเดเตเดเตผ, เดเดฐเต เดจเตเดกเดฟเดจเตเด เดเดเตเดณเดตเตเด เด
เดคเตเดฒเตเดฏเดตเตเดฎเดพเดฏ เดเดชเดฟ เดตเดฟเดฒเดพเดธเด เดเดณเตเดณเดคเตเด เดฎเดฑเตเดฑเต เดจเตเดกเตเดเดณเตเดฎเดพเดฏเดฟ เดจเตเดฐเดฟเดเตเดเต เดเดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด เดจเดเดคเตเดคเดพเตป เดเดดเดฟเดฏเตเดจเตเดจเดคเตเดฎเดพเดฏ เดเดฐเต เดเดเตเดเตเดค เดตเดฟเดฒเดพเดธ เดเดเด เด
เดจเตเดฎเดพเดจเดฟเดเตเดเต. เดเดชเตเดชเตเตพ เดเตปเดฑเตผเดจเตเดฑเตเดฑเดฟเดจเต เดตเตเดฏเดคเตเดฏเดธเตโเดคเดฎเดพเดฏ เดเดฐเต เดเตผเดเตเดเดฟเดเตเดเตเดเตผ เดเดฃเตเดเต - เดเดเตเดณ IP เดตเดฟเดฒเดพเดธเดเตเดเดณเตเดเต เดเดฐเต เดฎเตเดเดฒเดฏเตเด NAT เดเดชเดเดฐเดฃเดเตเดเตพเดเตเดเต เดชเดฟเดจเตเดจเดฟเตฝ เดฎเดฑเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดธเตเดตเดเดพเดฐเตเดฏ เดตเดฟเดฒเดพเดธเดเตเดเดณเตเดณเตเดณ เดจเดฟเดฐเดตเดงเดฟ เดฎเตเดเดฒเดเดณเตเด.
เดเตเดฒเดฏเดจเตเดฑเต-เดธเตเตผเดตเตผ เดเดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเต เดเดจเตเดฑเตผเดจเตเดฑเตเดฑเดฟเดจเตเดฑเต เด เดเตผเดเตเดเดฟเดเตเดเตเดเตผ เดฎเดคเดฟเดฏเดพเดฏเดคเดพเดฃเต, เด เดตเดฟเดเต เดเตเดฒเดฏเดจเตเดฑเตเดเตพเดเตเดเต เดธเตเดตเดเดพเดฐเตเดฏ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเดณเดฟเตฝ เดเดฏเดฟเดฐเดฟเดเตเดเดพเด, เดเตเดเดพเดคเต เดธเตเตผเดตเดฑเตเดเตพเดเตเดเต เดเดฐเต เดเดเตเดณ เดตเดฟเดฒเดพเดธเดฎเตเดฃเตเดเต. เดเดจเตเดจเดพเตฝ เดฐเดฃเตเดเต เดจเตเดกเตเดเดณเตเดเต เดจเตเดฐเดฟเดเตเดเตเดณเตเดณ เดเดฃเดเตเดทเดจเตเดณเตเดณ เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเต เดตเดฟเดตเดฟเดง เดธเตเดตเดเดพเดฐเตเดฏ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเตพ. เดตเตเดฏเดฟเดธเต เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป (เดธเตเดเตเดชเตเดชเต), เดเดฎเตเดชเตเดฏเตเดเตเดเดฑเดฟเดฒเตเดเตเดเต เดฑเดฟเดฎเตเดเตเดเต เดเดเตเดธเดธเต เดจเตเดเตฝ (เดเตเดเดตเตเดฏเตเดตเตผ) เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเตบเดฒเตเตป เดเตเดฏเดฟเดฎเดฟเดเดเต เดชเตเดฒเตเดณเตเดณ เดชเดฟเดฏเตผ-เดเต-เดชเดฟเดฏเตผ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพเดเตเดเต เดฐเดฃเตเดเต เดจเตเดกเตเดเตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดจเตเดฐเดฟเดเตเดเตเดณเตเดณ เดเดฃเดเตเดทเตป เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต.
เดตเตเดฏเดคเตเดฏเดธเตเดค เดธเตเดตเดเดพเดฐเตเดฏ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเดณเดฟเดฒเต เดเดชเดเดฐเดฃเดเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เดชเดฟเดฏเตผ-เดเต-เดชเดฟเดฏเตผ เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด เดซเดฒเดชเตเดฐเดฆเดฎเดพเดฏ เดฐเตเดคเดฟเดเดณเดฟเดฒเตเดจเตเดจเดพเดฃเต เดนเตเตพ เดชเดเตเดเดฟเดเดเต. UDP เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟเดฏเตเดณเตเดณ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเดณเดฟเดฒเดพเดฃเต เด เดธเดพเดเตเดเตเดคเดฟเดเดตเดฟเดฆเตเดฏ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต.
เดเดจเตเดจเดพเตฝ เดจเดฟเดเตเดเดณเตเดเต เด เดชเตเดฒเดฟเดเตเดเตเดทเดจเต เดกเดพเดฑเตเดฑเดฏเตเดเต เดเตเดฏเดพเดฐเดฃเตเดเตเดกเต เดกเตเดฒเดฟเดตเดฑเดฟ เดเดตเดถเตเดฏเดฎเดพเดฃเตเดเตเดเดฟเตฝ, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเดฟเดเตเดเตพ เดเดฎเตเดชเตเดฏเตเดเตเดเดฑเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เดซเดฏเดฒเตเดเตพ เดเตเดฎเดพเดฑเตเดจเตเดจเต, เดฏเตเดกเดฟเดชเดฟ เดเดฐเต เดเตเดฏเดพเดฐเดฃเตเดเดฟ เดกเตเดฒเดฟเดตเดฑเดฟ เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เด เดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เดเดฟเดธเดฟเดชเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เดชเดพเดเตเดเดฑเตเดฑเต เดกเตเดฒเดฟเดตเดฑเดฟ เดเตเดฐเดฎเดคเตเดคเดฟเตฝ เดจเตฝเดเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เดฏเตเดกเดฟเดชเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดตเดณเดฐเตเดฏเดงเดฟเดเด เดฌเตเดฆเตเดงเดฟเดฎเตเดเตเดเตเดเตพ เดเดฃเตเดเดพเดเตเด. เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ.
เด เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดเตเดฏเดพเดฐเดฃเตเดเตเดกเต เดชเดพเดเตเดเดฑเตเดฑเต เดกเตเดฒเดฟเดตเดฑเดฟ เดเดฑเดชเตเดชเดพเดเตเดเดพเตป, เดฏเตเดกเดฟเดชเดฟเดฏเดฟเตฝ เดเดตเดถเตเดฏเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดคเดฏเตเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดตเตเด เดจเตฝเดเตเดจเตเดจ เดเดฐเต เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เดฒเตเดฏเตผ เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต.
เดตเตเดฏเดคเตเดฏเดธเตเดค เดธเตเดตเดเดพเดฐเตเดฏ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเตเดเดณเดฟเตฝ เดจเตเดกเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เดเดฟเดธเดฟเดชเดฟ เดเดฃเดเตเดทเดจเตเดเตพ เดธเตเดฅเดพเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดฐเต เดเดฟเดธเดฟเดชเดฟ เดนเตเตพ เดชเดเตเดเดฟเดเดเต เดเตเดเตเดจเดฟเดเต เดเดฃเตเดเตเดจเตเดจเต เดเดพเตป เดเดเดจเดเดฟ เดถเตเดฐเดฆเตเดงเดฟเดเตเดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เดชเดฒ NAT เดเดชเดเดฐเดฃเดเตเดเดณเตเด เดเดคเดฟเดจเต เดชเดฟเดจเตเดคเตเดฃเดฏเดฟเดฒเตเดฒเดพเดคเตเดคเดคเดฟเดจเดพเตฝ, เดเดคเต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดเดฃเดเตเดฑเตเดฑเตเดเตเดฏเตเดฏเดพเดจเตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เดฎเดพเตผเดเดฎเดพเดฏเดฟ เดเดฃเดเตเดเดพเดเตเดเดฟเดฒเตเดฒ. เด เดคเตเดคเดฐเด เดจเตเดกเตเดเตพ.
เด เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เดฌเดพเดเตเดเดฟ เดญเดพเดเดเตเดเดณเดฟเตฝ, เดเตเดฏเดพเดฐเดฃเตเดเตเดกเต เดกเตเดฒเดฟเดตเดฑเดฟ เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเดฟเตฝ เดฎเดพเดคเตเดฐเด เดเดพเตป เดถเตเดฐเดฆเตเดง เดเตเดจเตเดฆเตเดฐเตเดเดฐเดฟเดเตเดเตเด. เดฏเตเดกเดฟเดชเดฟ เดนเตเตพ เดชเดเตเดเดฟเดเดเต เดเตเดเตเดจเดฟเดเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเต เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฒเตเดเดจเดเตเดเดณเดฟเตฝ เดตเดฟเดตเดฐเดฟเดเตเดเตเด.
เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเดตเดถเตเดฏเดเดคเดเตพ
- เดเดฐเต เดชเตเดธเดฟเดฑเตเดฑเตเดตเต เดซเตเดกเตโเดฌเดพเดเตเดเต เดฎเตเดเตเดเดพเดจเดฟเดธเดคเตเดคเดฟเดฒเตเดเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฟเดฏ เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เดกเตเดฒเดฟเดตเดฑเดฟ (เดชเตเดธเดฟเดฑเตเดฑเตเดตเต เด เดเดเตเดเดพเดฐเด เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเดต)
- เดตเดฒเดฟเดฏ เดกเดพเดฑเตเดฑเดฏเตเดเต เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฏ เดเตเดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต เดเดตเดถเตเดฏเดเดค, เด เดคเดพเดฏเดคเต. เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เด เดจเดพเดตเดถเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เดฑเดฟเดฒเตเดฏเดฟเดเดเต เดเดดเดฟเดตเดพเดเตเดเดฃเด
- เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃ เดธเดเดตเดฟเดงเดพเดจเด ("เดถเตเดฆเตเดงเดฎเดพเดฏ" UDP เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเต) เดฑเดฆเตเดฆเดพเดเตเดเตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเด.
- เดเดฐเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเตเดฏเตเด เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเดคเตเดคเตเดเต เดเดฎเดพเตปเดกเต เดฎเตเดกเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดพเดจเตเดณเตเดณ เดเดดเดฟเดตเต
- เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดตเดดเดฟเดฏเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดเตเดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต เด เดเดฟเดธเตเดฅเดพเดจ เดฏเตเดฃเดฟเดฑเตเดฑเต เดเดฐเต เดธเดจเตเดฆเตเดถเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเด
เด เดเดตเดถเตเดฏเดเดคเดเตพ เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเตเด เดตเดฟเดตเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดพ เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเดตเดถเตเดฏเดเดคเดเดณเตเดฎเดพเดฏเดฟ เดชเตเดฐเตเดคเตเดคเดชเตเดชเตเดเตเดจเตเดจเต
เด เดเดตเดถเตเดฏเดเดคเดเตพ เดฎเดจเดธเดฟเดฒเดพเดเตเดเดพเตป, TCP, UDP เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดฐเดฃเตเดเต เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดจเตเดกเตเดเตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดเตเดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเดฑเต เดธเดฎเดฏเด เดจเตเดเตเดเดพเด. เดฐเดฃเตเดเต เดธเดพเดนเดเดฐเตเดฏเดเตเดเดณเดฟเดฒเตเด เดจเดฎเตเดเตเดเต เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเต เดจเดทเตเดเดชเตเดชเตเดเตเด.
เดเดฟเดธเดฟเดชเดฟ เดตเดดเดฟ เดจเตเตบ-เดเดจเตเดฑเดฑเดพเดเตเดเตเดตเต เดกเดพเดฑเตเดฑ เดเตเดฎเดพเดฑเตเดฑเด:
เดกเดฏเดเตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเดจเดพเดเตเดจเตเดจเดคเตเดชเตเดฒเต, เดชเดพเดเตเดเดฑเตเดฑเต เดจเดทเตโเดเดชเตเดชเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดจเดทเตเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเต TCP เดเดฃเตเดเตเดคเตเดคเตเดเดฏเตเด เดจเดทเตโเดเดชเตเดชเตเดเตเด เดธเตเดเตโเดฎเตเดจเตเดฑเดฟเดจเตเดฑเต เดจเดฎเตเดชเตผ เดเตเดฆเดฟเดเตเดเต เด
เดฏเดเตเดเดฏเดพเดณเต เด
เดฑเดฟเดฏเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด.
UDP เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดตเดดเดฟ เดกเดพเดฑเตเดฑ เดเตเดฎเดพเดฑเตเดฑเด:
UDP เดจเดทเตเดเด เดเดฃเตเดเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดเดชเดเดฟเดเดณเตเดจเตเดจเตเด เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ. UDP เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดฒเต เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดชเดฟเดถเดเตเดเดณเตเดเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด เดชเตเตผเดฃเตเดฃเดฎเดพเดฏเตเด เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดฑเต เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดคเตเดคเดฎเดพเดฃเต.
เดเดฐเต เดเตปเดกเต เดจเตเดกเตเดฎเดพเดฏเดฟ เดเดฐเต เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเต, เด เดเดฃเดเตเดทเดจเตเดฑเต เด เดตเดธเตเดฅ เดธเดเดญเดฐเดฟเดเตเดเตเดเตเดฃเตเดเต, เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเต เดนเตเดกเดฑเดฟเดฒเตเด เด เดฏเดเตเด เดฌเตเดฑเตเดฑเตเดเดณเตเดเต เดเดฃเตเดฃเด เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเด เดเดฐเต เด เดเตเดจเตเดณเดเตเดฎเตเดจเตเดฑเต เดจเดฎเตเดชเตผ เดเดชเดฏเตเดเดฟเดเตเดเต เดฐเดธเตเดคเตเดเตพ เด เดฑเดฟเดฏเดฟเดเตเดเตเดจเตเดจเดคเดฟเดฒเตเดเตเดฏเตเด TCP เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเตฝ เดชเดฟเดถเดเต เดเดฃเตเดเตเดคเตเดคเตฝ เดธเดพเดงเตเดฏเดฎเดพเดฃเต.
เดเตเดเดพเดคเต, เดชเตเดฐเดเดเดจเด เดฎเตเดเตเดเดชเตเดชเตเดเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต (เด เดคเดพเดฏเดคเต เดเดฐเต เด เดเดเตเดเดพเดฐเด เดฒเดญเดฟเดเตเดเดพเดคเต เดเดจเตเดจเดฟเดฒเดงเดฟเดเด เดธเตเดเตโเดฎเตเดจเตเดฑเตเดเตพ เด เดฏเดฏเตโเดเตเดเตเด), TCP เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดตเดฟเตปเดกเต เดเดจเตเดจเต เดตเดฟเดณเดฟเดเตเดเตเดจเตเดจเต - เดธเตเดเตโเดฎเตเดจเตเดฑเดฟเดจเตเดฑเต เด เดฏเดเตเดเตเดจเตเดจเดฏเดพเตพเดเตเดเต เดฒเดญเดฟเดเตเดเตเดฎเตเดจเตเดจเต เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเตเดจเตเดจ เดกเดพเดฑเตเดฑเดฏเตเดเต เดฌเตเดฑเตเดฑเตเดเดณเตเดเต เดเดฃเตเดฃเด.
TCP เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดเตเดเตเดคเตฝ เดตเดฟเดตเดฐเดเตเดเตพเดเตเดเต, เดเดพเดฃเตเด
เดฎเตเดเดณเดฟเตฝ เดชเดฑเดเตเดเดตเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต, UDP-เดฏเดฟเตฝ เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดเดฐเต เดธเดจเตเดฆเตเดถ เดตเดฟเดคเดฐเดฃ เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต (เดเดจเดฟ เดฎเตเดคเตฝ เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP), เดเดฟเดธเดฟเดชเดฟเดเตเดเต เดธเดฎเดพเดจเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดพ เดเตเดฐเดพเตปเดธเตเดซเตผ เดฎเตเดเตเดเดพเดจเดฟเดธเดเตเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดฃเตเดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต. เด เดคเดพเดฏเดคเต:
- เดเดฃเดเตเดทเตป เดจเดฟเดฒ เดธเดเดฐเดเตเดทเดฟเดเตเดเตเด
- เดธเตเดเตเดฎเตเดจเตเดฑเต เดจเดฎเตเดชเดฑเดฟเดเดเต เดเดชเดฏเตเดเดฟเดเตเดเตเด
- เดชเตเดฐเดคเตเดฏเตเด เดธเตเดฅเดฟเดฐเตเดเดฐเดฃ เดชเดพเดเตเดเตเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเด
- เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดคเตเดฐเตเดชเตเดเตเดเต เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดตเดฟเตปเดกเต เดธเดเดตเดฟเดงเดพเดจเด เดเดชเดฏเตเดเดฟเดเตเดเตเด
เดเตเดเดพเดคเต, เดจเดฟเดเตเดเตพเดเตเดเต เดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต:
- เดเดฃเดเตเดทเดจเตเดณเตเดณ เดตเดฟเดญเดตเดเตเดเตพ เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดฐเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดเดฐเดเดญเด เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเด
- เดฒเดญเดฟเดเตเด เดธเดจเตเดฆเตเดถเด เด เดชเตโเดธเตเดเตเดฐเตเด เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเดฟเดฒเตเดเตเดเต เดเตเดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเตเด เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเดฑเดตเดฟเดเดเตเดเตพ เดฑเดฟเดฒเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดเดฐเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เด เดตเดธเดพเดจเด เดธเตเดเดจ เดจเตฝเดเตเด
- "เดถเตเดฆเตเดงเดฎเดพเดฏ" UDP เดเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃ เดธเดเดตเดฟเดงเดพเดจเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดเตเดเดพเตป เดเดฃเดเตเดทเตป-เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เด เดจเตเดตเดฆเดฟเดเตเดเตเด
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP เดคเดฒเดเตเดเตเดเตเดเต
เดเดฐเต เดฏเตเดกเดฟเดชเดฟ เดกเดพเดฑเตเดฑเดเตเดฐเดพเด เดเดฐเต เดเดชเดฟ เดกเดพเดฑเตเดฑเดพเดเตเดฐเดพเดฎเดฟเตฝ เดเตพเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดเตผเดเตเดเตเด. เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP เดชเดพเดเตเดเดฑเตเดฑเต เดเดฐเต UDP เดกเดพเดฑเตเดฑเดพเดเตเดฐเดพเดฎเดฟเดฒเตเดเตเดเต เดเดเดฟเดคเดฎเดพเดฏเดฟ "เดชเตเดคเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต".
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP เดคเดฒเดเตเดเตเดเตเดเต เดเตปเดเตเดฏเดพเดชเตโเดธเตเดฒเตเดทเตป:
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP เดคเดฒเดเตเดเตเดเตเดเดฟเดจเตเดฑเต เดเดเดจ เดตเดณเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฃเต:
- เดชเดคเดพเดเดเตพ - เดชเดพเดเตเดเตเดเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃ เดซเตเดฒเดพเดเตเดเตพ
- MessageType - เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดธเดจเตเดฆเตเดถเดเตเดเตพ เดธเดฌเตโเดธเตโเดเตเดฐเตเดฌเตเดเตเดฏเตเดฏเดพเตป เด เดชเตโเดธเตเดเตเดฐเตเด เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจ เดธเดจเตเดฆเตเดถ เดคเดฐเด
- TransmissionId - เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดจเดฎเตเดชเตผ, เดธเตเดตเตเดเตผเดคเตเดคเดพเดตเดฟเดจเตเดฑเต เดตเดฟเดฒเดพเดธเดตเตเด เดชเตเตผเดเตเดเตเด เดเตเตผเดจเตเดจเต, เดเดฃเดเตเดทเดจเต เด เดฆเตเดตเดฟเดคเตเดฏเดฎเดพเดฏเดฟ เดคเดฟเดฐเดฟเดเตเดเดฑเดฟเดฏเตเดจเตเดจเต
- เดชเดพเดเตเดเดฑเตเดฑเต เดจเดฎเตเดชเตผ - เดชเดพเดเตเดเดฑเตเดฑเต เดจเดฎเตเดชเตผ
- เดเดชเตเดทเดจเตเดเตพ - เด เดงเดฟเด เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเดชเตเดทเดจเตเดเตพ. เดเดฆเตเดฏเดคเตเดคเต เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเตเดฑเต เดเดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดตเดฒเตเดชเตเดชเด เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดคเต เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต
เดชเดคเดพเดเดเตพ เดเดชเตเดฐเดเดพเดฐเดฎเดพเดฃเต:
- เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต - เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเต
- NoAsk - เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเต เดเดฐเต เด เดเดเตเดเดพเดฐ เดธเดเดตเดฟเดงเดพเดจเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเตเดฃเตเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒ
- LastPacket - เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เด เดตเดธเดพเดจ เดชเดพเดเตเดเดฑเตเดฑเต
- RequestForPacket - เดธเตเดฅเดฟเดฐเตเดเดฐเดฃ เดชเดพเดเตเดเดฑเตเดฑเต เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดจเดทเตเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเดพเดฏเดฟ เด เดญเตเดฏเตผเดคเตเดฅเดฟเดเตเดเตเด
เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เดชเตเดคเต เดคเดคเตเดตเดเตเดเตพ
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP เดฐเดฃเตเดเต เดจเตเดกเตเดเตพเดเตเดเดฟเดเดฏเดฟเดฒเตเดณเตเดณ เดเตเดฏเดพเดฐเดฃเตเดเตเดกเต เดธเดจเตเดฆเตเดถ เดชเตเดฐเดเตเดทเตเดชเดฃเดคเตเดคเดฟเตฝ เดถเตเดฐเดฆเตเดง เดเตเดจเตเดฆเตเดฐเตเดเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เด เดคเดฟเดจเต เดฎเดฑเตเดตเดถเดตเตเดฎเดพเดฏเดฟ เดเดฐเต เดฌเดจเตเดงเด เดธเตเดฅเดพเดชเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดฃเด. เดเดฐเต เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เด เดฏเดเตเดเดฏเดพเตพ เดซเดธเตเดฑเตเดฑเตเดชเดพเดเตเดเดฑเตเดฑเต เดซเตเดฒเดพเดเต เดเดณเตเดณ เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเต เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต, เด เดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดคเดฟเดเดฐเดฃเด เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเต เดเดจเตเดจเดพเดฃเต เด เตผเดคเตเดฅเดฎเดพเดเตเดเตเดจเตเดจเดคเต. เดเดฒเตเดฒเดพ เดชเตเดฐเดคเดฟเดเดฐเดฃ เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเด, เด เดฒเตเดฒเตเดเตเดเดฟเตฝ, เดฎเดฑเตเดฑเตเดฐเต เดตเดฟเดงเดคเตเดคเดฟเตฝ เดชเดฑเดเตเดเดพเตฝ, เด เดเตโเดจเตเดณเดเตโเดฎเตเดจเตเดฑเต เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเด, เดชเดพเดเตเดเดฑเตเดฑเต เดจเดฎเตเดชเตผ เดซเตเตฝเดกเดฟเดจเตเดฑเต เดฎเตเดฒเตเดฏเด, เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏเดฟ เดฒเดญเดฟเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเดเต เดเดฑเตเดฑเดตเตเด เดตเดฒเดฟเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เดจเดฎเตเดชเตผ เดฎเตเดฒเตเดฏเดคเตเดคเตเดเตเดเดพเตพ เดเดจเตเดจเดพเดฏเดฟ เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดฆเตเดฏเด เด เดฏเดเตเด เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเตเดณเตเดณ เดเดชเตเดทเดจเตเดเตพ เดซเตเตฝเดกเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดตเดฒเตเดชเตเดชเดฎเดพเดฃเต.
เดเดฐเต เดเดฃเดเตเดทเตป เด
เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดธเดฎเดพเดจเดฎเดพเดฏ เดเดฐเต เดธเดเดตเดฟเดงเดพเดจเด เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เด
เดตเดธเดพเดจ เดชเดพเดเตเดเดฑเตเดฑเดฟเตฝ LastPacket เดซเตเดฒเดพเดเต เดธเดเตเดเตเดเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดชเตเดฐเดคเดฟเดเดฐเดฃ เดชเดพเดเตเดเดฑเตเดฑเดฟเตฝ, เด
เดตเดธเดพเดจ เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเตเดฑเต เดจเดฎเตเดชเตผ + 1 เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต, เดเดคเต เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดตเดถเดคเตเดคเดฟเดจเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏ เดกเตเดฒเดฟเดตเดฑเดฟ เดเดจเตเดจเดพเดฃเต เด
เตผเดคเตเดฅเดฎเดพเดเตเดเตเดจเตเดจเดคเต.
เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเดฒเตเด เด
เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเดฒเตเด เดกเดฏเดเตเดฐเด:
เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเตเดฎเตเดชเตเตพ, เดกเดพเดฑเตเดฑ เดเตเดฎเดพเดฑเตเดฑเด เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต. เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเดเต เดฌเตเดฒเตเดเตเดเตเดเดณเดฟเดฒเดพเดฃเต เดกเดพเดฑเตเดฑ เดเตเดฎเดพเดฑเตเดจเตเดจเดคเต. เด
เดตเดธเดพเดจเดคเตเดคเตเดคเต เดเดดเดฟเดเต เดเดฐเต เดฌเตเดฒเตเดเตเดเดฟเดฒเตเด เดเดฐเต เดจเดฟเดถเตเดเดฟเดค เดเดฃเตเดฃเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เด
เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดคเต เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ/เดชเตเดฐเดเตเดทเตเดชเดฃเด เดเตเดฏเตเดฏเตเดจเตเดจ เดตเดฟเตปเดกเต เดตเดฒเตเดชเตเดชเดคเตเดคเดฟเดจเต เดคเตเดฒเตเดฏเดฎเดพเดฃเต. เดกเดพเดฑเตเดฑเดฏเตเดเต เด
เดตเดธเดพเดจ เดฌเตเดฒเตเดเตเดเดฟเตฝ เดเตเดฑเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเดพเด. เดเดฐเต เดฌเตเดฒเตเดเตเดเตเด เด
เดฏเดเตเดเดคเดฟเดจเต เดถเตเดทเด, เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเดคเตเดคเดฟเดจเต เดจเดทเตโเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด
เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตโเดเตเดเต เดตเตเดฃเตเดเดฟ เด
เดฏเดฏเตเดเตเดเตเดจเตเดจ เดตเดถเด เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต, เดชเตเดฐเดคเดฟเดเดฐเดฃเดเตเดเตพ เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ/เดเตเดฐเดพเตปเดธเตเดฎเดฟเดฑเตเดฑเต เดตเดฟเตปเดกเต เดคเตเดฑเดจเตเดจเต เดตเดฟเดเตเดจเตเดจเต. เดฌเตเดฒเตเดเตเดเต เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเด เดฒเดญเดฟเดเตเดเดคเดฟเดจเต เดถเตเดทเด, เดธเตเดตเตเดเดฐเดฟเดเตเดเตเด/เดเตเดฐเดพเตปเดธเตเดฎเดฟเดฑเตเดฑเต เดตเดฟเตปเดกเต เดฎเดพเดฑเตเดเดฏเตเด เดกเดพเดฑเตเดฑเดฏเตเดเต เด
เดเตเดคเตเดค เดฌเตเดฒเตเดเตเดเต เด
เดฏเดฏเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดตเดถเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเตเด เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดตเดฟเตปเดกเตเดฏเดฟเตฝ เดตเตเดดเตเดจเตเดจเตเดฃเตเดเต เดเดจเตเดจเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต. เดตเดฟเตปเดกเตเดฏเดฟเตฝ เดตเตเดดเดพเดคเตเดค เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเด เดกเตเดฏเตเดชเตเดฒเดฟเดเตเดเตเดฑเตเดฑเตเดเดณเตเด เดซเดฟเตฝเดเตเดเตผ เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเดพเดฐเดฃเด เดตเดฟเตปเดกเตเดฏเตเดเต เดตเดฒเตเดชเตเดชเด เดจเดฟเดถเตเดเดฏเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเตเด เดธเตเดตเตเดเตผเดคเตเดคเดพเดตเดฟเดจเตเด เด
เดฏเดฏเตเดเตเดเตเดจเตเดจเดฏเดพเตพเดเตเดเตเด เดเดฐเตเดชเตเดฒเตเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดเดฐเต เดฌเตเดฒเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดจเดทเตโเดเดชเตเดชเตเดเดพเดคเต เดกเตเดฒเดฟเดตเตผ เดเตเดฏเตเดฏเตเดจเตเดจ เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด
เดเตเดคเตเดค เดกเดพเดฑเตเดฑเดพ เดฌเตเดฒเตเดเตเดเดฟเดจเตเดฑเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดตเดฟเตปเดกเต เดฎเดพเดฑเตเดฑเตเดเดฏเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเด เด
เดฏเดเตเดเต. เดตเตผเดเตเดเต เดเตเดฎเตผ เดธเดเตเดเตเดเดฐเดฟเดเตเด เดเดพเดฒเดฏเดณเดตเดฟเดจเตเดณเตเดณเดฟเตฝ เดตเดฟเตปเดกเต เดชเตเดฐเดฟเดชเตเดชเดฟเดเตเดเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดเดคเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดกเตเดฒเดฟเดตเตผ เดเตเดฏเตเดคเดฟเดเตเดเดฟเดฒเตเดฒเตเดจเตเดจเต เดเดฐเต เดชเดฐเดฟเดถเตเดงเดจ เดเดฐเดเดญเดฟเดเตเดเตเดเดฏเตเด เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เด
เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เด
เดฏเดฏเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด.
เดฑเตเดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดกเดฏเดเตเดฐเด:
เดเตเดเดเดเตเดเตเดเดณเตเด เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเตเดฎเดฑเตเดเดณเตเด
เดเดฐเต เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดพเดคเตเดคเดคเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เดเดพเดฐเดฃเดเตเดเดณเตเดฃเตเดเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดชเดพเตผเดเตเดเดฟ เดเดซเตโเดฒเตเดจเดพเดฃเตเดเตเดเดฟเตฝ. เด เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดเดฐเต เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดฎเตเดชเตเตพ, เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดฎเตเดชเตเตพ เดเดฃเดเตเดทเตป เด เดเดฏเตเดเตเดเตเด. เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ เดธเดฎเดฏเดชเดฐเดฟเดงเดฟ เดธเดเตเดเตเดเดฐเดฟเดเตเดเดพเตป เดฐเดฃเตเดเต เดเตเดฎเดฑเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เดฑเดฟเดฎเตเดเตเดเต เดนเตเดธเตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดชเตเดฐเดคเดฟเดเดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเดพเตป เดเดฆเตเดฏเดคเตเดคเตเดคเต, เดตเตผเดเตเดเดฟเดเดเต เดเตเดฎเตผ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต. เด เดคเต เด เดฏเดเตเดเดฏเดพเดณเตเดเต เดญเดพเดเดคเตเดคเต เดคเตเดชเดฟเดเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เด เดตเดธเดพเดจเด เด เดฏเดเตเด เดชเดพเดเตเดเดฑเตเดฑเต เดตเตเดฃเตเดเตเด เด เดฏเดเตเดเต. เดธเตเดตเตเดเตผเดคเตเดคเดพเดตเดฟเตฝ เดเตเดฎเตผ เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดจเดทเตเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพเดเตเดเดพเดฏเดฟ เดเดฐเต เดชเดฐเดฟเดถเตเดงเดจ เดจเดเดคเตเดคเตเดเดฏเตเด เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เด เดฏเดฏเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด.
เดจเตเดกเตเดเตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดเดถเดฏเดตเดฟเดจเดฟเดฎเดฏเดคเตเดคเดฟเดจเตเดฑเต เด เดญเดพเดตเดคเตเดคเดฟเตฝ เดเดฃเดเตเดทเตป เด เดเดฏเตเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดฐเดฃเตเดเดพเดฎเดคเตเดคเต เดเตเดฎเตผ เดเดตเดถเตเดฏเดฎเดพเดฃเต. เด เดฏเดเตเดเดฏเดพเดณเต เดธเดเดฌเดจเตเดงเดฟเดเตเดเดฟเดเดคเตเดคเตเดณเด, เดตเตผเดเตเดเดฟเดเดเต เดเตเดฎเตผ เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเด เดเดเตป เดคเดจเตเดจเต เดเดคเต เดเดฐเดเดญเดฟเดเตเดเตเดเดฏเตเด เดฑเดฟเดฎเตเดเตเดเต เดจเตเดกเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดชเตเดฐเดคเดฟเดเดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดเดพเดฒเดฏเดณเดตเดฟเดจเตเดณเตเดณเดฟเตฝ เดชเตเดฐเดคเดฟเดเดฐเดฃเดฎเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดเดฃเดเตเดทเตป เด เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เดเดฑเดตเดฟเดเดเตเดเตพ เดชเตเดฑเดคเตเดคเตเดตเดฟเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด. เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดญเดพเดเดคเตเดคเดฟเดจเต, เดตเตผเดเตเดเต เดเตเดฎเตผ เดฐเดฃเตเดเตเดคเดตเดฃ เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดเดคเดฟเดจเต เดถเตเดทเด เดเดฃเดเตเดทเตป เดเตเดฒเตเดธเต เดเตเดฎเตผ เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต. เดธเตเดฅเดฟเดฐเตเดเดฐเดฃ เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเตเดฑเต เดจเดทเตเดเดคเตเดคเดฟเดจเตเดคเดฟเดฐเต เดเตปเดทเตเดตเตผ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต. เดเตเดฎเตผ เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดฎเตเดชเตเตพ, เดเดฃเดเตเดทเดจเตเด เด เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เดเดฑเดตเดฟเดเดเตเดเตพ เดชเตเดฑเดคเตเดคเตเดตเดฟเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดธเตเดฑเตเดฑเตเดฑเตเดฑเต เดกเดฏเดเตเดฐเด
เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เดคเดคเตเดตเดเตเดเตพ เดเดฐเต เดซเดฟเดจเดฟเดฑเตเดฑเต เดธเตเดฑเตเดฑเตเดฑเตเดฑเต เดฎเตเดทเตเดจเดฟเตฝ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต, เดเดฐเต เด
เดตเดธเตเดฅเดฏเตเด เดชเดพเดเตเดเดฑเตเดฑเต เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเดฟเดจเตเดฑเต เดเดฐเต เดจเดฟเดถเตเดเดฟเดค เดฒเตเดเดฟเดเตเดเดฟเดจเต เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต.
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP เดธเตเดฑเตเดฑเตเดฑเตเดฑเต เดกเดฏเดเตเดฐเด:
เด
เดเดเตเด - เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดเดฐเต เดธเดเดธเตเดฅเดพเดจเดฎเดฒเตเดฒ, เดเดคเต เดเดเตเดเตเดฎเดพเดฑเตเดฑเดฃเดฟเดจเตเดฑเต เดเดฐเดเดญเดตเตเด เด
เดตเดธเดพเดจเดตเตเด เดเดฃเต. เดธเดเดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเต เด
เดเดเตเด เดเดฐเต เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดเตบเดเตเดฐเตเตพ เดฌเตเดฒเตเดเตเดเต เดฒเดญเดฟเดเตเดเตเดจเตเดจเต, เดเดคเต เดเดฐเต เด
เดธเดฟเตปเดเตเดฐเดฃเดธเต เดฏเตเดกเดฟเดชเดฟ เดธเตเตผเดตเตผ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฟ, เดเดเดฟเดคเดฎเดพเดฏ เดเดฃเดเตเดทเดจเตเดเดณเดฟเดฒเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเตเดฎเดพเดฑเตเดเดฏเตเด เดธเตเดฑเตเดฑเตเดฑเตเดฑเต เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเต เดเดฐเดเดญเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต - เดธเดจเตเดฆเตเดถเด เด เดฏเดฏเตโเดเตเดเตเดฎเตเดชเตเตพ เดเดเตเดเตโเดเตเดฏเดฟเดเดเต เดเดฃเดเตเดทเดจเตเดฑเต เดชเตเดฐเดพเดฐเดเดญ เด เดตเดธเตเดฅ.
เด เด เดตเดธเตเดฅเดฏเดฟเตฝ, เดธเดพเดงเดพเดฐเดฃ เดธเดจเตเดฆเตเดถเดเตเดเตพเดเตเดเตเดณเตเดณ เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เด เดฏเดเตเดเต. เด เดฏเดเตเดเตเดจเตเดจ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเด เดเดฒเตเดฒเดพเดคเตเดค เดธเดจเตเดฆเตเดถเดเตเดเตพเดเตเดเต, เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเตเดถเดตเตเด เด เดฏเดเตเดเตเดจเตเดจ เดเดฐเตเดฏเตเดฐเต เดธเดเดธเตเดฅเดพเดจเดฎเดพเดฃเดฟเดคเต.
เด เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ - เดธเดจเตเดฆเตเดถ เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเดเต เดชเตเดฐเดเตเดทเตเดชเดฃเดคเตเดคเดฟเดจเตเดณเตเดณ เดเตเดฐเตเดฃเตเดเต เดธเตเดฑเตเดฑเตเดฑเตเดฑเต.
เดธเดเดธเตเดฅเดพเดจเดคเตเดคเต เดจเดฟเดจเตเดจเต เด เดคเดฟเดฒเตเดเตเดเตเดณเตเดณ เดฎเดพเดฑเตเดฑเด เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เด เดฏเดเตเดเดคเดฟเดจเต เดถเตเดทเด เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต. เด เด เดตเดธเตเดฅเดฏเดฟเดฒเดพเดฃเต เดชเตเดจเดเดธเดเดชเตเดฐเตเดเตเดทเดฃเดคเตเดคเดฟเดจเตเดณเตเดณ เดเดฒเตเดฒเดพ เด เดเดเตเดเดพเดฐเดเตเดเดณเตเด เด เดญเตเดฏเตผเดคเตเดฅเดจเดเดณเตเด เดตเดฐเตเดจเตเดจเดคเต. เด เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฑเดคเตเดคเตเดเดเดเตเดเตเดจเตเดจเดคเต เดฐเดฃเตเดเต เดธเดจเตเดฆเตผเดญเดเตเดเดณเดฟเตฝ เดธเดพเดงเตเดฏเดฎเดพเดฃเต - เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏ เดกเตเดฒเดฟเดตเดฑเดฟ เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตฝ.
เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เดฒเดญเดฟเดเตเดเต - เดธเดจเตเดฆเตเดถเด เดธเตเดตเตเดเตผเดคเตเดคเดพเดตเดฟเดจเตเดฑเต เดชเตเดฐเดพเดฐเดเดญ เด เดตเดธเตเดฅ.
เดเดคเต เดชเตเดฐเดเตเดทเตเดชเดฃเดคเตเดคเดฟเดจเตเดฑเต เดคเตเดเดเตเดเดคเตเดคเดฟเดจเตเดฑเต เดเตเดคเตเดฏเดค เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต, เดเดตเดถเตเดฏเดฎเดพเดฏ เดเดเดจเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเต, เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเตเดฑเต เดฐเดธเตเดคเดฟเดฏเตเดเต เดเดฐเต เด เดเดเตเดเดพเดฐเด เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต.
เดเดฐเตเดฑเตเดฑ เดชเดพเดเตเดเดฑเตเดฑเต เด เดเดเตเดเดฟเดฏเดคเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เดคเตเดณเดฟเดตเต เดเดชเดฏเตเดเดฟเดเตเดเดพเดคเต เด เดฏเดเตเดเดคเตเดฎเดพเดฏ เดเดฐเต เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเต, เดเดคเต เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดธเดเดธเตเดฅเดพเดจเด. เด เดคเตเดคเดฐเดฎเตเดฐเต เดธเดจเตเดฆเตเดถเด เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดค เดถเตเดทเด, เดเดฃเดเตเดทเตป เด เดเดเตเดเต.
เด เดธเดเดฌเตเดฒเดฟเดเดเต - เดธเดจเตเดฆเตเดถ เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด เดเดฟเดธเตเดฅเดพเดจ เด เดตเดธเตเดฅ.
เดเดคเต เดคเดพเตฝเดเตเดเดพเดฒเดฟเด เดธเดเดญเดฐเดฃเดคเตเดคเดฟเดฒเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเดดเตเดคเตเดจเตเดจเต, เดชเดพเดเตเดเดฑเตเดฑเต เดจเดทเตเดเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต, เดเดฐเต เดฌเตเดฒเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเด เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเตเดถเดตเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด เดเดเตเดเดพเดฐเดเตเดเตพ เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต, เดจเดทเตเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต. เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเตเดถเดตเตเด เดตเดฟเดเดฏเดเดฐเดฎเดพเดฃเตเดเตเดเดฟเตฝ, เดเดฃเดเตเดทเตป เดธเดเดธเตเดฅเดพเดจเดคเตเดคเตเดเตเดเต เดชเตเดเตเดจเตเดจเต เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ, เด เดฒเตเดฒเตเดเตเดเดฟเตฝ, เดเดฐเต เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตฝ เดชเตเดฑเดชเตเดชเตเดเตเดจเตเดจเต.
เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ - เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเตเดถเดตเตเด เดตเดฟเดเดฏเดเดฐเดฎเดพเดฃเตเดเตเดเดฟเตฝ เดเดฃเดเตเดทเตป เด เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต.
เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เด เดธเดเดฌเตเดฒเดฟเดเตเดเตเด เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเด เด เดฏเดเตเดเดฏเดพเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ เดตเดดเดฟเดฏเดฟเตฝ เดจเดทเตโเดเดฎเดพเดฏ เดธเดจเตเดฆเตผเดญเดคเตเดคเดฟเดจเตเด เด เด เดตเดธเตเดฅ เดเดตเดถเตเดฏเดฎเดพเดฃเต. เด เด เดตเดธเตเดฅ เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดฎเตเดชเตเตพ เดชเตเดฑเดคเตเดคเตเดเดเดจเตเดจเต, เดชเดเตเดทเต เดเดฃเดเตเดทเตป เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏเดฟ เด เดตเดธเดพเดจเดฟเดเตเดเดคเดพเดฏเดฟ เดเดฃเดเตเดเดพเดเตเดเตเดจเตเดจเต.
เดเตเดกเดฟเดฒเตเดเตเดเต เดเตเดเตเดคเตฝ เดเดดเดคเตเดคเดฟเตฝ. เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดเตบเดเตเดฐเตเตพ เดฏเตเดฃเดฟเดฑเตเดฑเต
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดฏเตเดกเดฟเดชเดฟเดฏเตเดเต เดชเตเดฐเดงเดพเดจ เดเดเดเดเตเดเดณเดฟเดฒเตเดจเตเดจเดพเดฃเต เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดเตบเดเตเดฐเตเตพ เดฌเตเดฒเตเดเตเดเต. เดจเดฟเดฒเดตเดฟเดฒเต เดเดฃเดเตเดทเดจเตเดเดณเตเด เดธเดนเดพเดฏ เดเดเดเดเตเดเดณเตเด เดธเดเดญเดฐเดฟเดเตเดเตเด, เด
เดจเตเดฌเดจเตเดง เดเดฃเดเตเดทเดจเตเดเดณเดฟเดฒเตเดเตเดเต เดเตปเดเดฎเดฟเดเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดฏเตเด, เดเดฐเต เดเดฃเดเตเดทเดจเดฟเดฒเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เด
เดฏเดฏเตเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดเดจเตเดฑเตผเดซเตเดธเต เดจเตฝเดเตเด, เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ API เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเด เดเดจเตเดจเดฟเดตเดฏเดพเดฃเต เด เดฌเตเดฒเตเดเตเดเดฟเดจเตเดฑเต เดเตเดฎเดคเดฒ. เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดเตบเดเตเดฐเตเตพ เดฌเตเดฒเตเดเตเดเต เดฏเตเดกเดฟเดชเดฟ เดฒเตเดฏเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดเดฏเตเด เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเดฟเดจเดพเดฏเดฟ เดธเตเดฑเตเดฑเตเดฑเตเดฑเต เดฎเตเดทเตเดจเดฟเดฒเตเดเตเดเต เดเตเดฎเดพเดฑเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดเดคเต เดเดฐเต เด
เดธเดฟเตปเดเตเดฐเดฃเดธเต เดฏเตเดกเดฟเดชเดฟ เดธเตเตผเดตเตผ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต.
ReliableUdpConnectionControlBlock เดเตเดฒเดพเดธเดฟเดฒเต เดเดฟเดฒ เด
เดเดเดเตเดเตพ:
internal class ReliableUdpConnectionControlBlock : IDisposable
{
// ะผะฐััะธะฒ ะฑะฐะนั ะดะปั ัะบะฐะทะฐะฝะฝะพะณะพ ะบะปััะฐ. ะัะฟะพะปัะทัะตััั ะดะปั ัะฑะพัะบะธ ะฒั
ะพะดััะธั
ัะพะพะฑัะตะฝะธะน
public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> IncomingStreams { get; private set;}
// ะผะฐััะธะฒ ะฑะฐะนั ะดะปั ัะบะฐะทะฐะฝะฝะพะณะพ ะบะปััะฐ. ะัะฟะพะปัะทัะตััั ะดะปั ะพัะฟัะฐะฒะบะธ ะธัั
ะพะดััะธั
ัะพะพะฑัะตะฝะธะน.
public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> OutcomingStreams { get; private set; }
// connection record ะดะปั ัะบะฐะทะฐะฝะฝะพะณะพ ะบะปััะฐ.
private readonly ConcurrentDictionary<Tuple<EndPoint, Int32>, ReliableUdpConnectionRecord> m_listOfHandlers;
// ัะฟะธัะพะบ ะฟะพะดะฟะธััะธะบะพะฒ ะฝะฐ ัะพะพะฑัะตะฝะธั.
private readonly List<ReliableUdpSubscribeObject> m_subscribers;
// ะปะพะบะฐะปัะฝัะน ัะพะบะตั
private Socket m_socketIn;
// ะฟะพัั ะดะปั ะฒั
ะพะดััะธั
ัะพะพะฑัะตะฝะธะน
private int m_port;
// ะปะพะบะฐะปัะฝัะน IP ะฐะดัะตั
private IPAddress m_ipAddress;
// ะปะพะบะฐะปัะฝะฐั ะบะพะฝะตัะฝะฐั ัะพัะบะฐ
public IPEndPoint LocalEndpoint { get; private set; }
// ะบะพะปะปะตะบัะธั ะฟัะตะดะฒะฐัะธัะตะปัะฝะพ ะธะฝะธัะธะฐะปะธะทะธัะพะฒะฐะฝะฝัั
// ัะพััะพัะฝะธะน ะบะพะฝะตัะฝะพะณะพ ะฐะฒัะพะผะฐัะฐ
public StatesCollection States { get; private set; }
// ะณะตะฝะตัะฐัะพั ัะปััะฐะนะฝัั
ัะธัะตะป. ะัะฟะพะปัะทัะตััั ะดะปั ัะพะทะดะฐะฝะธั TransmissionId
private readonly RNGCryptoServiceProvider m_randomCrypto;
//...
}
เด เดธเดฟเตปเดเตเดฐเดฃเดธเต เดฏเตเดกเดฟเดชเดฟ เดธเตเตผเดตเตผ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ:
private void Receive()
{
EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
// ัะพะทะดะฐะตะผ ะฝะพะฒัะน ะฑััะตั, ะดะปั ะบะฐะถะดะพะณะพ socket.BeginReceiveFrom
byte[] buffer = new byte[DefaultMaxPacketSize + ReliableUdpHeader.Length];
// ะฟะตัะตะดะฐะตะผ ะฑััะตั ะฒ ะบะฐัะตััะฒะต ะฟะฐัะฐะผะตััะฐ ะดะปั ะฐัะธะฝั
ัะพะฝะฝะพะณะพ ะผะตัะพะดะฐ
this.m_socketIn.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref connectedClient, EndReceive, buffer);
}
private void EndReceive(IAsyncResult ar)
{
EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
int bytesRead = this.m_socketIn.EndReceiveFrom(ar, ref connectedClient);
//ะฟะฐะบะตั ะฟะพะปััะตะฝ, ะณะพัะพะฒั ะฟัะธะฝะธะผะฐัั ัะปะตะดัััะธะน
Receive();
// ั.ะบ. ะฟัะพััะตะนัะธะน ัะฟะพัะพะฑ ัะตัะธัั ะฒะพะฟัะพั ั ะฑััะตัะพะผ - ะฟะพะปััะธัั ัััะปะบั ะฝะฐ ะฝะตะณะพ
// ะธะท IAsyncResult.AsyncState
byte[] bytes = ((byte[]) ar.AsyncState).Slice(0, bytesRead);
// ะฟะพะปััะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตัะฐ
ReliableUdpHeader header;
if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
{
// ะฟัะธัะตะป ะฝะตะบะพััะตะบัะฝัะน ะฟะฐะบะตั - ะพัะฑัะฐััะฒะฐะตะผ ะตะณะพ
return;
}
// ะบะพะฝััััะธััะตะผ ะบะปัั ะดะปั ะพะฟัะตะดะตะปะตะฝะธั connection recordโะฐ ะดะปั ะฟะฐะบะตัะฐ
Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
// ะฟะพะปััะฐะตะผ ัััะตััะฒััััั connection record ะธะปะธ ัะพะทะดะฐะตะผ ะฝะพะฒัั
ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header.ReliableUdpMessageType));
// ะทะฐะฟััะบะฐะตะผ ะฟะฐะบะตั ะฒ ะพะฑัะฐะฑะพัะบั ะฒ ะบะพะฝะตัะฝัะน ะฐะฒัะพะผะฐั
record.State.ReceivePacket(record, header, bytes);
}
เดเดฐเต เดธเดจเตเดฆเตเดถ เดเตเดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดจเตเด, เดเดฃเดเตเดทเดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดตเดฟเดตเดฐเดเตเดเตพ เดเตพเดเตเดเตเดณเตเดณเตเดจเตเดจ เดเดฐเต เดเดเดจ เดธเตเดทเตเดเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเต. เด
เดคเตเดคเดฐเดฎเตเดฐเต เดเดเดจเดฏเต เดตเดฟเดณเดฟเดเตเดเตเดจเตเดจเต เดเดฃเดเตเดทเตป เดฑเตเดเตเดเตเตผเดกเต.
ReliableUdpConnectionRecord เดเตเดฒเดพเดธเดฟเดฒเต เดเดฟเดฒ เด
เดเดเดเตเดเตพ:
internal class ReliableUdpConnectionRecord : IDisposable
{
// ะผะฐััะธะฒ ะฑะฐะนั ั ัะพะพะฑัะตะฝะธะตะผ
public byte[] IncomingStream { get; set; }
// ัััะปะบะฐ ะฝะฐ ัะพััะพัะฝะธะต ะบะพะฝะตัะฝะพะณะพ ะฐะฒัะพะผะฐัะฐ
public ReliableUdpState State { get; set; }
// ะฟะฐัะฐ, ะพะดะฝะพะทะฝะฐัะฝะพ ะพะฟัะตะดะตะปัััะฐั connection record
// ะฒ ะฑะปะพะบะต ัะฟัะฐะฒะปะตะฝะธั ะฟะตัะตะดะฐัะตะน
public Tuple<EndPoint, Int32> Key { get; private set;}
// ะฝะธะถะฝัั ะณัะฐะฝะธัะฐ ะฟัะธะตะผะฝะพะณะพ ะพะบะฝะฐ
public int WindowLowerBound;
// ัะฐะทะผะตั ะพะบะฝะฐ ะฟะตัะตะดะฐัะธ
public readonly int WindowSize;
// ะฝะพะผะตั ะฟะฐะบะตัะฐ ะดะปั ะพัะฟัะฐะฒะบะธ
public int SndNext;
// ะบะพะปะธัะตััะฒะพ ะฟะฐะบะตัะพะฒ ะดะปั ะพัะฟัะฐะฒะบะธ
public int NumberOfPackets;
// ะฝะพะผะตั ะฟะตัะตะดะฐัะธ (ะธะผะตะฝะฝะพ ะพะฝ ะธ ะตััั ะฒัะพัะฐั ัะฐััั Tuple)
// ะดะปั ะบะฐะถะดะพะณะพ ัะพะพะฑัะตะฝะธั ัะฒะพะน
public readonly Int32 TransmissionId;
// ัะดะฐะปะตะฝะฝัะน IP endpoint โ ัะพะฑััะฒะตะฝะฝะพ ะฟะพะปััะฐัะตะปั ัะพะพะฑัะตะฝะธั
public readonly IPEndPoint RemoteClient;
// ัะฐะทะผะตั ะฟะฐะบะตัะฐ, ะฒะพ ะธะทะฑะตะถะฐะฝะธะต ััะฐะณะผะตะฝัะฐัะธะธ ะฝะฐ IP ััะพะฒะฝะต
// ะฝะต ะดะพะปะถะตะฝ ะฟัะตะฒััะฐัั MTU โ (IP.Header + UDP.Header + RelaibleUDP.Header)
public readonly int BufferSize;
// ะฑะปะพะบ ัะฟัะฐะฒะปะตะฝะธั ะฟะตัะตะดะฐัะตะน
public readonly ReliableUdpConnectionControlBlock Tcb;
// ะธะฝะบะฐะฟััะปะธััะตั ัะตะทัะปััะฐัั ะฐัะธะฝั
ัะพะฝะฝะพะน ะพะฟะตัะฐัะธะธ ะดะปั BeginSendMessage/EndSendMessage
public readonly AsyncResultSendMessage AsyncResult;
// ะฝะต ะพัะฟัะฐะฒะปััั ะฟะฐะบะตัั ะฟะพะดัะฒะตัะถะดะตะฝะธั
public bool IsNoAnswerNeeded;
// ะฟะพัะปะตะดะฝะธะน ะบะพััะตะบัะฝะพ ะฟะพะปััะตะฝะฝัะน ะฟะฐะบะตั (ะฒัะตะณะดะฐ ัััะฐะฝะฐะฒะปะธะฒะฐะตััั ะฒ ะฝะฐะธะฑะพะปััะธะน ะฝะพะผะตั)
public int RcvCurrent;
// ะผะฐััะธะฒ ั ะฝะพะผะตัะฐะผะธ ะฟะพัะตััะฝะฝัั
ะฟะฐะบะตัะพะฒ
public int[] LostPackets { get; private set; }
// ะฟัะธัะตะป ะปะธ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั. ะัะฟะพะปัะทัะตััั ะบะฐะบ bool.
public int IsLastPacketReceived = 0;
//...
}
เดเตเดกเดฟเดฒเตเดเตเดเต เดเดดเดคเตเดคเดฟเตฝ. เดชเตเดฐเดธเตเดคเดพเดตเดฟเดเตเดเตเดจเตเดจเต
เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเดเต เดชเตเดฐเดงเดพเดจ เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเต เดจเดเดเตเดเตเดจเตเดจ เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดฏเตเดกเดฟเดชเดฟ เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เดธเตเดฑเตเดฑเตเดฑเตเดฑเต เดฎเตเดทเตเตป เดธเดเดธเตเดฅเดพเดจเดเตเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต. ReliableUdpState เดเดจเตเดจ เด เดฎเตเตผเดคเตเดค เดเตเดฒเดพเดธเต เดธเดเดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเต เดเดฐเต เดเดจเตเดฑเตผเดซเตเดธเต เดจเตฝเดเตเดจเตเดจเต:
เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เดฎเตเดดเตเดตเตป เดฒเตเดเดฟเดเตเดเตเด เดฎเตเดเดณเดฟเตฝ เด
เดตเดคเดฐเดฟเดชเตเดชเดฟเดเตเด เดเตเดฒเดพเดธเตเดเดณเดพเตฝ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต, เดเตเดเดพเดคเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดฐเตเดคเดฟเดเตพ เดจเตฝเดเตเดจเตเดจ เดเดฐเต เดเดเตเดธเดฟเดฒเดฑเดฟ เดเตเดฒเดพเดธเดฟเดจเตเดชเตเดชเด, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดฃเดเตเดทเตป เดฑเตเดเตเดเตเตผเดกเดฟเตฝ เดจเดฟเดจเตเดจเต ReliableUdp เดคเดฒเดเตเดเตเดเตเดเต เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเดจเตเดจเดคเต.
เด เดเตเดคเตเดคเดคเดพเดฏเดฟ, เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เด เดเดฟเดธเตเดฅเดพเดจ เด เตฝเดเตเดฐเดฟเดคเดเตเดเตพ เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดเตเดเตเดจเตเดจ เดเดจเตเดฑเตผเดซเตเดธเต เดฐเตเดคเดฟเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเต เดเดเตเดเตพ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฐเดฟเดเดฃเดฟเดเตเดเตเด.
DisposeByTimeout เดฐเตเดคเดฟ
DisposeByTimeout เดฐเตเดคเดฟ เดเดฐเต เดธเดฎเดฏเดชเดฐเดฟเดงเดฟเดเตเดเต เดถเตเดทเด เดเดฃเดเตเดทเตป เดเดฑเดตเดฟเดเดเตเดเตพ เดฑเดฟเดฒเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏ/เดชเดฐเดพเดเดฏเดชเตเดชเตเดเตเด เดธเดจเตเดฆเตเดถ เดกเตเดฒเดฟเดตเดฑเดฟ เดธเดฟเดเตเดจเตฝ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต.
ReliableUdpState.DisposeByTimeout:
protected virtual void DisposeByTimeout(object record)
{
ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;
if (record.AsyncResult != null)
{
connectionRecord.AsyncResult.SetAsCompleted(false);
}
connectionRecord.Dispose();
}
เดธเดเดธเตเดฅเดพเดจเดคเตเดคเต เด
เดคเต เดฎเดฑเดฟเดเดเดเตเดเตเด เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเต เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ.
เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ. เดธเดฎเดฏเดชเดฐเดฟเดงเดฟ เดชเตเดฐเดเดพเดฐเด เดกเดฟเดธเตเดชเตเดธเต เดเตเดฏเตเดฏเตเด:
protected override void DisposeByTimeout(object record)
{
ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;
// ัะพะพะฑัะฐะตะผ ะพะฑ ััะฟะตัะฝะพะผ ะฟะพะปััะตะฝะธะธ ัะพะพะฑัะตะฝะธั
SetAsCompleted(connectionRecord);
}
ProcessPackets เดฐเตเดคเดฟ
เดเดฐเต เดชเดพเดเตเดเตเดเดฟเดจเตเดฑเตเดฏเต เดชเดพเดเตเดเตเดเตเดเดณเตเดเตเดฏเต เด เดงเดฟเด เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเดฟเดจเต เดชเตเดฐเตเดธเดธเตเดชเดพเดเตเดเดฑเตเดฑเตเดธเต เดฐเตเดคเดฟ เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต. เดจเตเดฐเดฟเดเตเดเต เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเต เดตเตเดฏเตเดฑเตเดฑเต เดเตเดฎเตผ เดตเดดเดฟเดฏเต เดตเดฟเดณเดฟเดเตเดเต.
เดเดดเดฟเดตเตเดณเตเดณ เด
เดธเดเดฌเตเดฒเดฟเดเดเต เด เดฐเตเดคเดฟ เด
เดธเดพเดงเตเดตเดพเดเตเดเตเดเดฏเตเด เดจเดทเตเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดธเดเดธเตเดฅเดพเดจเดคเตเดคเตเดเตเดเต เดฎเดพเดฑเตเดจเตเดจเดคเดฟเดจเตเด เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ, เด
เดตเดธเดพเดจ เดชเดพเดเตเดเดฑเตเดฑเต เดฒเดญเดฟเดเตเดเตเดเดฏเตเด เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏ เดเดฐเต เดเตเดเตเดเต เดชเดพเดธเดพเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดคเดพเตฝ
เด
เดธเดเดฌเตเดฒเดฟเดเดเต.เดชเตเดฐเตเดธเดธเตเดชเดพเดเตเดเดฑเตเดฑเตเดเตพ:
public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
if (connectionRecord.IsDone != 0)
return;
if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
{
// ะตััั ะฟะพัะตััะฝะฝัะต ะฟะฐะบะตัั, ะพัััะปะฐะตะผ ะทะฐะฟัะพัั ะฝะฐ ะฝะธั
foreach (int seqNum in connectionRecord.LostPackets)
{
if (seqNum != 0)
{
ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
}
}
// ัััะฐะฝะฐะฒะปะธะฒะฐะตะผ ัะฐะนะผะตั ะฒะพ ะฒัะพัะพะน ัะฐะท, ะดะปั ะฟะพะฒัะพัะฝะพะน ะฟะพะฟััะบะธ ะฟะตัะตะดะฐัะธ
if (!connectionRecord.TimerSecondTry)
{
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
connectionRecord.TimerSecondTry = true;
return;
}
// ะตัะปะธ ะฟะพัะปะต ะดะฒัั
ะฟะพะฟััะพะบ ััะฐะฑะฐััะฒะฐะฝะธะน WaitForPacketTimer
// ะฝะต ัะดะฐะปะพัั ะฟะพะปััะธัั ะฟะฐะบะตัั - ะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตั ะทะฐะฒะตััะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
StartCloseWaitTimer(connectionRecord);
}
else if (connectionRecord.IsLastPacketReceived != 0)
// ััะฟะตัะฝะฐั ะฟัะพะฒะตัะบะฐ
{
// ะฒัััะปะฐะตะผ ะฟะพะดัะฒะตัะถะดะตะฝะธะต ะพ ะฟะพะปััะตะฝะธะธ ะฑะปะพะบะฐ ะดะฐะฝะฝัั
ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
connectionRecord.State = connectionRecord.Tcb.States.Completed;
connectionRecord.State.ProcessPackets(connectionRecord);
// ะฒะผะตััะพ ะผะพะผะตะฝัะฐะปัะฝะพะน ัะตะฐะปะธะทะฐัะธะธ ัะตััััะพะฒ
// ะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตั, ะฝะฐ ัะปััะฐะน, ะตัะปะธ
// ะตัะปะธ ะฟะพัะปะตะดะฝะธะน ack ะฝะต ะดะพะนะดะตั ะดะพ ะพัะฟัะฐะฒะธัะตะปั ะธ ะพะฝ ะทะฐะฟัะพัะธั ะตะณะพ ัะฝะพะฒะฐ.
// ะฟะพ ััะฐะฑะฐััะฒะฐะฝะธั ัะฐะนะผะตัะฐ - ัะตะฐะปะธะทัะตะผ ัะตััััั
// ะฒ ัะพััะพัะฝะธะธ Completed ะผะตัะพะด ัะฐะนะผะตัะฐ ะฟะตัะตะพะฟัะตะดะตะปะตะฝ
StartCloseWaitTimer(connectionRecord);
}
// ััะพ ัะปััะฐะน, ะบะพะณะดะฐ ack ะฝะฐ ะฑะปะพะบ ะฟะฐะบะตัะพะฒ ะฑัะป ะฟะพัะตััะฝ
else
{
if (!connectionRecord.TimerSecondTry)
{
ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
connectionRecord.TimerSecondTry = true;
return;
}
// ะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตั ะทะฐะฒะตััะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
StartCloseWaitTimer(connectionRecord);
}
}
เดเดดเดฟเดตเตเดณเตเดณ เด
เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ เด เดฐเตเดคเดฟ เดเดฐเต เดเตเดฎเดฑเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต เดตเดฟเดณเดฟเดเตเดเต, เด
เดตเดธเดพเดจ เดธเดจเตเดฆเตเดถเด เดตเตเดฃเตเดเตเด เด
เดฏเดฏเตโเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดเดฃเดเตเดทเตป เดเตเดฒเตเดธเต เดเตเดฎเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดเดคเต เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต.
SendingCycle.ProcessPackets:
public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
if (connectionRecord.IsDone != 0)
return;
// ะพัะฟัะฐะฒะปัะตะผ ะฟะพะฒัะพัะฝะพ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั
// ( ะฒ ัะปััะฐะต ะฒะพัััะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ัะทะตะป-ะฟัะธะตะผะฝะธะบ ะทะฐะฝะพะฒะพ ะพัะฟัะฐะฒะธั ะทะฐะฟัะพัั, ะบะพัะพััะต ะดะพ ะฝะตะณะพ ะฝะต ะดะพัะปะธ)
ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, connectionRecord.SndNext - 1));
// ะฒะบะปััะฐะตะผ ัะฐะนะผะตั CloseWait โ ะดะปั ะพะถะธะดะฐะฝะธั ะฒะพัััะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ะธะปะธ ะตะณะพ ะทะฐะฒะตััะตะฝะธั
StartCloseWaitTimer(connectionRecord);
}
เดเดดเดฟเดตเตเดณเตเดณ เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ เด เดฐเตเดคเดฟ เดฑเดฃเตเดฃเดฟเดเดเต เดเตเดฎเตผ เดจเดฟเตผเดคเตเดคเตเดเดฏเตเด เดตเดฐเดฟเดเตเดเดพเตผเดเตเดเต เดธเดจเตเดฆเตเดถเด เด
เดฏเดฏเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ.เดชเตเดฐเตเดธเดธเตเดชเดพเดเตเดเดฑเตเดฑเตเดเตพ:
public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
if (connectionRecord.WaitForPacketsTimer != null)
connectionRecord.WaitForPacketsTimer.Dispose();
// ัะพะฑะธัะฐะตะผ ัะพะพะฑัะตะฝะธะต ะธ ะฟะตัะตะดะฐะตะผ ะตะณะพ ะฟะพะดะฟะธััะธะบะฐะผ
ReliableUdpStateTools.CreateMessageFromMemoryStream(connectionRecord);
}
เดฑเดฟเดธเตเดตเต เดชเดพเดเตเดเดฑเตเดฑเต เดฐเตเดคเดฟ
เดเดดเดฟเดตเตเดณเตเดณ เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เดฒเดญเดฟเดเตเดเต เดเดฆเตเดฏ เดธเดจเตเดฆเตเดถ เดชเดพเดเตเดเดฑเตเดฑเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดเดจเตเดฑเตผเดซเตเดธเดฟเตฝ เดเดคเตเดคเดฟเดฏเต เดเดจเตเดจเต เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดเตเดเตเด, เดเตเดเดพเดคเต เดเดฐเตเดฑเตเดฑ เดชเดพเดเตเดเดฑเตเดฑเต เด
เดเดเตเดเดฟเดฏ เดเดฐเต เดธเดจเตเดฆเตเดถเด เดถเตเดเดฐเดฟเดเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต เดฐเตเดคเดฟเดฏเตเดเต เดชเตเดฐเดงเดพเดจ เดฆเตเดคเตเดฏเด.
เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เดฒเดญเดฟเดเตเดเต. เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดชเดพเดเตเดเดฑเตเดฑเต:
public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
// ะพัะฑัะฐััะฒะฐะตะผ ะฟะฐะบะตั
return;
// ะบะพะผะฑะธะฝะฐัะธั ะดะฒัั
ัะปะฐะณะพะฒ - FirstPacket ะธ LastPacket - ะณะพะฒะพัะธั ััะพ ั ะฝะฐั ะตะดะธะฝััะฒะตะฝะฝะพะต ัะพะพะฑัะตะฝะธะต
if (header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) &
header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
{
ReliableUdpStateTools.CreateMessageFromSinglePacket(connectionRecord, header, payload.Slice(ReliableUdpHeader.Length, payload.Length));
if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
{
// ะพัะฟัะฐะฒะปัะตะผ ะฟะฐะบะตั ะฟะพะดัะฒะตัะถะดะตะฝะธะต
ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
}
SetAsCompleted(connectionRecord);
return;
}
// by design ะฒัะต packet numbers ะฝะฐัะธะฝะฐัััั ั 0;
if (header.PacketNumber != 0)
return;
ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
// ััะธัะฐะตะผ ะบะพะป-ะฒะพ ะฟะฐะบะตัะพะฒ, ะบะพัะพััะต ะดะพะปะถะฝั ะฟัะธะนัะธ
connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
// ะทะฐะฟะธััะฒะฐะตะผ ะฝะพะผะตั ะฟะพัะปะตะดะฝะตะณะพ ะฟะพะปััะตะฝะฝะพะณะพ ะฟะฐะบะตัะฐ (0)
connectionRecord.RcvCurrent = header.PacketNumber;
// ะฟะพัะปะต ัะดะฒะธะฝัะปะธ ะพะบะฝะพ ะฟัะธะตะผะฐ ะฝะฐ 1
connectionRecord.WindowLowerBound++;
// ะฟะตัะตะบะปััะฐะตะผ ัะพััะพัะฝะธะต
connectionRecord.State = connectionRecord.Tcb.States.Assembling;
// ะตัะปะธ ะฝะต ััะตะฑัะตััั ะผะตั
ะฐะฝะธะทะผ ะฟะพะดัะฒะตัะถะดะตะฝะธะต
// ะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตั ะบะพัะพััะน ะฒััะฒะพะฑะพะดะธั ะฒัะต ััััะบัััั
if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
{
connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}
else
{
ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}
}
เดเดดเดฟเดตเตเดณเตเดณ เด
เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ เดกเตเดฒเดฟเดตเดฑเดฟ เด
เดเดเตเดเดพเดฐเดเตเดเดณเตเด เดฑเตเดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เด
เดญเตเดฏเตผเดคเตเดฅเดจเดเดณเตเด เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เด เดฐเตเดคเดฟ เด
เดธเดพเดงเตเดตเดพเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต.
SendingCycle.ReceivePacket:
public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
if (connectionRecord.IsDone != 0)
return;
if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.RequestForPacket))
return;
// ัะฐััะตั ะบะพะฝะตัะฝะพะน ะณัะฐะฝะธัั ะพะบะฝะฐ
// ะฑะตัะตััั ะณัะฐะฝะธัะฐ ะพะบะฝะฐ + 1, ะดะปั ะฟะพะปััะตะฝะธั ะฟะพะดัะฒะตัะถะดะตะฝะธะน ะดะพััะฐะฒะบะธ
int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize), (connectionRecord.NumberOfPackets));
// ะฟัะพะฒะตัะบะฐ ะฝะฐ ะฟะพะฟะฐะดะฐะฝะธะต ะฒ ะพะบะฝะพ
if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > windowHighestBound)
return;
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
if (connectionRecord.CloseWaitTimer != null)
connectionRecord.CloseWaitTimer.Change(-1, -1);
// ะฟัะพะฒะตัะธัั ะฝะฐ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั:
if (header.PacketNumber == connectionRecord.NumberOfPackets)
{
// ะฟะตัะตะดะฐัะฐ ะทะฐะฒะตััะตะฝะฐ
Interlocked.Increment(ref connectionRecord.IsDone);
SetAsCompleted(connectionRecord);
return;
}
// ััะพ ะพัะฒะตั ะฝะฐ ะฟะตัะฒัะน ะฟะฐะบะตั c ะฟะพะดัะฒะตัะถะดะตะฝะธะตะผ
if ((header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) && header.PacketNumber == 1))
{
// ะฑะตะท ัะดะฒะธะณะฐ ะพะบะฝะฐ
SendPacket(connectionRecord);
}
// ะฟัะธัะปะพ ะฟะพะดัะฒะตัะถะดะตะฝะธะต ะพ ะฟะพะปััะตะฝะธะธ ะฑะปะพะบะฐ ะดะฐะฝะฝัั
else if (header.PacketNumber == windowHighestBound)
{
// ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ ะฟัะธะตะผ/ะฟะตัะตะดะฐัะธ
connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
// ะพะฑะฝัะปัะตะผ ะผะฐััะธะฒ ะบะพะฝััะพะปั ะฟะตัะตะดะฐัะธ
connectionRecord.WindowControlArray.Nullify();
// ะพัะฟัะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตัะพะฒ
SendPacket(connectionRecord);
}
// ััะพ ะทะฐะฟัะพั ะฝะฐ ะฟะพะฒัะพัะฝัั ะฟะตัะตะดะฐัั โ ะพัะฟัะฐะฒะปัะตะผ ััะตะฑัะตะผัะน ะฟะฐะบะตั
else
ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}
เดเดดเดฟเดตเตเดณเตเดณ เด
เดธเดเดฌเตเดฒเดฟเดเดเต เดฑเดฟเดธเตเดตเตเดชเดพเดเตเดเดฑเตเดฑเต เดฐเตเดคเดฟเดฏเดฟเตฝ, เดเตปเดเดฎเดฟเดเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฐเต เดธเดจเตเดฆเตเดถเด เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เดเตเดฒเดฟ เดจเดเดเตเดเตเดจเตเดจเต.
เด
เดธเดเดฌเตเดฒเดฟเดเดเต.เดฑเดฟเดธเตเดตเตเดชเดพเดเตเดเดฑเตเดฑเต:
public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
if (connectionRecord.IsDone != 0)
return;
// ะพะฑัะฐะฑะพัะบะฐ ะฟะฐะบะตัะพะฒ ั ะพัะบะปััะตะฝะฝัะผ ะผะตั
ะฐะฝะธะทะผะพะผ ะฟะพะดัะฒะตัะถะดะตะฝะธั ะดะพััะฐะฒะบะธ
if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
{
// ัะฑัะฐััะฒะฐะตะผ ัะฐะนะผะตั
connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
// ะทะฐะฟะธััะฒะฐะตะผ ะดะฐะฝะฝัะต
ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
// ะตัะปะธ ะฟะพะปััะธะปะธ ะฟะฐะบะตั ั ะฟะพัะปะตะดะฝะธะผ ัะปะฐะณะพะผ - ะดะตะปะฐะตะผ ะทะฐะฒะตััะฐะตะผ
if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
{
connectionRecord.State = connectionRecord.Tcb.States.Completed;
connectionRecord.State.ProcessPackets(connectionRecord);
}
return;
}
// ัะฐััะตั ะบะพะฝะตัะฝะพะน ะณัะฐะฝะธัั ะพะบะฝะฐ
int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize - 1), (connectionRecord.NumberOfPackets - 1));
// ะพัะฑัะฐััะฒะฐะตะผ ะฝะต ะฟะพะฟะฐะดะฐััะธะต ะฒ ะพะบะฝะพ ะฟะฐะบะตัั
if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > (windowHighestBound))
return;
// ะพัะฑัะฐััะฒะฐะตะผ ะดัะฑะปะธะบะฐัั
if (connectionRecord.WindowControlArray.Contains(header.PacketNumber))
return;
// ะทะฐะฟะธััะฒะฐะตะผ ะดะฐะฝะฝัะต
ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
// ัะฒะตะปะธัะธะฒะฐะตะผ ััะตััะธะบ ะฟะฐะบะตัะพะฒ
connectionRecord.PacketCounter++;
// ะทะฐะฟะธััะฒะฐะตะผ ะฒ ะผะฐััะธะฒ ัะฟัะฐะฒะปะตะฝะธั ะพะบะฝะพะผ ัะตะบััะธะน ะฝะพะผะตั ะฟะฐะบะตัะฐ
connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
// ัััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐะธะฑะพะปััะธะน ะฟัะธัะตะดัะธะน ะฟะฐะบะตั
if (header.PacketNumber > connectionRecord.RcvCurrent)
connectionRecord.RcvCurrent = header.PacketNumber;
// ะฟะตัะตะทะฐะฟััะบะฐะผ ัะฐะนะผะตัั
connectionRecord.TimerSecondTry = false;
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
if (connectionRecord.CloseWaitTimer != null)
connectionRecord.CloseWaitTimer.Change(-1, -1);
// ะตัะปะธ ะฟัะธัะตะป ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั
if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
{
Interlocked.Increment(ref connectionRecord.IsLastPacketReceived);
}
// ะตัะปะธ ะฝะฐะผ ะฟัะธัะปะธ ะฒัะต ะฟะฐะบะตัั ะพะบะฝะฐ, ัะพ ัะฑัะฐััะฒะฐะตะผ ััะตััะธะบ
// ะธ ะฒัััะปะฐะตะผ ะฟะฐะบะตั ะฟะพะดัะฒะตัะถะดะตะฝะธะต
else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
{
// ัะฑัะฐััะฒะฐะตะผ ััะตััะธะบ.
connectionRecord.PacketCounter = 0;
// ัะดะฒะธะฝัะปะธ ะพะบะฝะพ ะฟะตัะตะดะฐัะธ
connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
// ะพะฑะฝัะปะตะฝะธะต ะผะฐััะธะฒะฐ ัะฟัะฐะฒะปะตะฝะธั ะฟะตัะตะดะฐัะตะน
connectionRecord.WindowControlArray.Nullify();
ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
}
// ะตัะปะธ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั ัะถะต ะธะผะตะตััั
if (Thread.VolatileRead(ref connectionRecord.IsLastPacketReceived) != 0)
{
// ะฟัะพะฒะตััะตะผ ะฟะฐะบะตัั
ProcessPackets(connectionRecord);
}
}
เดเดดเดฟเดตเตเดณเตเดณ เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเตเดฑเต เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏ เดกเตเดฒเดฟเดตเดฑเดฟเดเตเดเต เดตเตเดฃเตเดเตเด เด
เดเดเตเดเดพเดฐเด เด
เดฏเดฏเตเดเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต เด เดฐเตเดคเดฟเดฏเตเดเต เดเดฐเตเดฏเตเดฐเต เดเตเดฎเดคเดฒ.
เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏเดฟ. เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดชเดพเดเตเดเดฑเตเดฑเต:
public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
// ะฟะพะฒัะพัะฝะฐั ะพัะฟัะฐะฒะบะฐ ะฟะพัะปะตะดะฝะตะณะพ ะฟะฐะบะตัะฐ ะฒ ัะฒัะทะธ ั ัะตะผ,
// ััะพ ะฟะพัะปะตะดะฝะธะน ack ะฝะต ะดะพัะตะป ะดะพ ะพัะฟัะฐะฒะธัะตะปั
if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
{
ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
}
}
เดชเดพเดเตเดเดฑเตเดฑเต เดฐเตเดคเดฟ เด
เดฏเดฏเตเดเตเดเตเด
เดเดดเดฟเดตเตเดณเตเดณ เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เด
เดฏเดฏเตเดเตเดเตเดจเตเดจเต เด เดฐเตเดคเดฟ เดกเดพเดฑเตเดฑเดฏเตเดเต เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เด
เดฏเดฏเตเดเตเดเตเดจเตเดจเต, เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเต เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเด เดเดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดฎเตเดดเตเดตเตป เดธเดจเตเดฆเตเดถเดตเตเด.
FirstPacketSending.SendPacket:
public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
connectionRecord.PacketCounter = 0;
connectionRecord.SndNext = 0;
connectionRecord.WindowLowerBound = 0;
// ะตัะปะธ ะฟะพะดัะฒะตัะถะดะตะฝะธั ะฝะต ััะตะฑัะตััั - ะพัะฟัะฐะฒะปัะตะผ ะฒัะต ะฟะฐะบะตัั
// ะธ ะฒััะฒะพะฑะพะถะดะฐะตะผ ัะตััััั
if (connectionRecord.IsNoAnswerNeeded)
{
// ะะดะตัั ะฟัะพะธัั
ะพะดะธั ะพัะฟัะฐะฒะบะฐ As Is
do
{
ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, ReliableUdpStateTools. CreateReliableUdpHeader(connectionRecord)));
connectionRecord.SndNext++;
} while (connectionRecord.SndNext < connectionRecord.NumberOfPackets);
SetAsCompleted(connectionRecord);
return;
}
// ัะพะทะดะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตัะฐ ะธ ะพัะฟัะฐะฒะปัะตะผ ะตะณะพ
ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
// ัะฒะตะปะธัะธะฒะฐะตะผ ััะตััะธะบ
connectionRecord.SndNext++;
// ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ
connectionRecord.WindowLowerBound++;
connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
// ะะฐะฟััะบะฐะตะผ ัะฐะนะผะตั
connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}
เดเดดเดฟเดตเตเดณเตเดณ เด
เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ เด เดฐเตเดคเดฟเดฏเดฟเตฝ, เดเดฐเต เดฌเตเดฒเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เด
เดฏเดฏเตเดเตเดเตเดจเตเดจเต.
SendingCycle.SendPacket:
public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
// ะพัะฟัะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตัะพะฒ
for (connectionRecord.PacketCounter = 0;
connectionRecord.PacketCounter < connectionRecord.WindowSize &&
connectionRecord.SndNext < connectionRecord.NumberOfPackets;
connectionRecord.PacketCounter++)
{
ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
connectionRecord.SndNext++;
}
// ะฝะฐ ัะปััะฐะน ะฑะพะปััะพะณะพ ะพะบะฝะฐ ะฟะตัะตะดะฐัะธ, ะฟะตัะตะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตั ะฟะพัะปะต ะพัะฟัะฐะฒะบะธ
connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
if ( connectionRecord.CloseWaitTimer != null )
{
connectionRecord.CloseWaitTimer.Change( -1, -1 );
}
}
เดเตเดกเดฟเดฒเตเดเตเดเต เดเตเดเตเดคเตฝ เดเดดเดคเตเดคเดฟเตฝ. เดเดฃเดเตเดทเดจเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดเดฏเตเด เดธเตเดฅเดพเดชเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต
เดเดชเตเดชเตเตพ เดจเดฎเตเดฎเตพ เด
เดเดฟเดธเตเดฅเดพเดจ เดธเตเดฑเตเดฑเตเดฑเตเดฑเตเดเดณเตเด เดธเตเดฑเตเดฑเตเดฑเตเดฑเตเดเตพ เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจ เดฐเตเดคเดฟเดเดณเตเด เดเดฃเตเดเตเดเดดเดฟเดเตเดเต, เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเดเตเดเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต เดเดจเตเดจเดคเดฟเดจเตเดฑเต เดเตเดฑเดเตเดเต เดเดฆเดพเดนเดฐเดฃเดเตเดเตพ เดเตเดฑเดเตเดเตเดเตเดเดฟ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดจเตเดเตเดเดพเด.
เดธเดพเดงเดพเดฐเดฃ เด
เดตเดธเตเดฅเดฏเดฟเตฝ เดกเดพเดฑเตเดฑเดพ เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดกเดฏเดเตเดฐเด:
เดธเตเดทเตเดเดฟเดฏเตเดเตเดเตเดฑเดฟเดเตเดเต เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเดฐเดฟเดเดฃเดฟเดเตเดเตเด เดเดฃเดเตเดทเตป เดฑเตเดเตเดเตเตผเดกเต เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เดเดฃเดเตเดฑเตเดฑเตเดเตเดฏเตเดฏเดพเดจเตเด เด
เดฏเดฏเตเดเตเดเดพเดจเตเด. เดธเดจเตเดฆเตเดถเดฎเดฏเดฏเตโเดเตเดเตฝ API-เดฏเต เดตเดฟเดณเดฟเดเตเดเตเดจเตเดจ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเดพเดฃเต เดเตเดฎเดพเดฑเตเดฑเด เดเดชเตเดชเตเดดเตเด เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเดคเต. เด
เดเตเดคเตเดคเดคเดพเดฏเดฟ, เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดเตบเดเตเดฐเตเตพ เดฌเตเดฒเตเดเตเดเดฟเดจเตเดฑเต StartTransmission เดฐเตเดคเดฟ เด
เดญเตเดฏเตผเดคเตเดฅเดฟเดเตเดเตเดจเตเดจเต, เดเดคเต เดชเตเดคเดฟเดฏ เดธเดจเตเดฆเตเดถเดคเตเดคเดฟเดจเดพเดฏเตเดณเตเดณ เดกเดพเดฑเตเดฑเดฏเตเดเต เดชเตเดฐเดเตเดทเตเดชเดฃเด เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต.
เดเดฐเต เดเดเตเดเตเดเตเดฏเดฟเดเดเต เดเดฃเดเตเดทเตป เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเต:
private void StartTransmission(ReliableUdpMessage reliableUdpMessage, EndPoint endPoint, AsyncResultSendMessage asyncResult)
{
if (m_isListenerStarted == 0)
{
if (this.LocalEndpoint == null)
{
throw new ArgumentNullException( "", "You must use constructor with parameters or start listener before sending message" );
}
// ะทะฐะฟััะบะฐะตะผ ะพะฑัะฐะฑะพัะบั ะฒั
ะพะดััะธั
ะฟะฐะบะตัะพะฒ
StartListener(LocalEndpoint);
}
// ัะพะทะดะฐะตะผ ะบะปัั ะดะปั ัะปะพะฒะฐัั, ะฝะฐ ะพัะฝะพะฒะต EndPoint ะธ ReliableUdpHeader.TransmissionId
byte[] transmissionId = new byte[4];
// ัะพะทะดะฐะตะผ ัะปััะฐะนะฝัะน ะฝะพะผะตั transmissionId
m_randomCrypto.GetBytes(transmissionId);
Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
// ัะพะทะดะฐะตะผ ะฝะพะฒัั ะทะฐะฟะธัั ะดะปั ัะพะตะดะธะฝะตะฝะธั ะธ ะฟัะพะฒะตััะตะผ,
// ัััะตััะฒัะตั ะปะธ ัะถะต ัะฐะบะพะน ะฝะพะผะตั ะฒ ะฝะฐัะธั
ัะปะพะฒะฐััั
if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
{
// ะตัะปะธ ัััะตััะฒัะตั โ ัะพ ะฟะพะฒัะพัะฝะพ ะณะตะฝะตัะธััะตะผ ัะปััะฐะนะฝัะน ะฝะพะผะตั
m_randomCrypto.GetBytes(transmissionId);
key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
// ะตัะปะธ ัะฝะพะฒะฐ ะฝะต ัะดะฐะปะพัั โ ะณะตะฝะตัะธััะตะผ ะธัะบะปััะตะฝะธะต
throw new ArgumentException("Pair TransmissionId & EndPoint is already exists in the dictionary");
}
// ะทะฐะฟัััะธะปะธ ัะพััะพัะฝะธะต ะฒ ะพะฑัะฐะฑะพัะบั
m_listOfHandlers[key].State.SendPacket(m_listOfHandlers[key]);
}
เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เด เดฏเดฏเตโเดเตเดเตเดจเตเดจเต (เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เด เดฏเดฏเตโเดเตเดเตเดจเตเดจ เด เดตเดธเตเดฅ):
public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
connectionRecord.PacketCounter = 0;
connectionRecord.SndNext = 0;
connectionRecord.WindowLowerBound = 0;
// ...
// ัะพะทะดะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตัะฐ ะธ ะพัะฟัะฐะฒะปัะตะผ ะตะณะพ
ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
// ัะฒะตะปะธัะธะฒะฐะตะผ ััะตััะธะบ
connectionRecord.SndNext++;
// ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ
connectionRecord.WindowLowerBound++;
// ะฟะตัะตั
ะพะดะธะผ ะฒ ัะพััะพัะฝะธะต SendingCycle
connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
// ะะฐะฟััะบะฐะตะผ ัะฐะนะผะตั
connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}
เดเดฆเตเดฏเดคเตเดคเต เดชเดพเดเตเดเดฑเตเดฑเต เด
เดฏเดเตเด เดถเตเดทเด, เด
เดฏเดเตเดเดฏเดพเตพ เดธเดเดธเตเดฅเดพเดจเดคเตเดคเตเดเตเดเต เดชเตเดฐเดตเตเดถเดฟเดเตเดเตเดจเตเดจเต เด
เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ - เดชเดพเดเตเดเตเดเต เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเด.
เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดตเดถเด, EndReceive เดฐเตเดคเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต, เด
เดฏเดเตเด เดชเดพเดเตเดเดฑเตเดฑเต เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต, เดชเตเดคเดฟเดฏเดคเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเต เดเดฃเดเตเดทเตป เดฑเตเดเตเดเตเตผเดกเต เดเตเดเดพเดคเต เด เดชเดพเดเตเดเดฑเตเดฑเต, เดเดฐเต เดชเตเดฐเต-เดชเดพเดดเตโเดธเต เดเตเดฏเตเดค เดคเดฒเดเตเดเตเดเตเดเตเดเต, เดธเดเดธเตโเดเดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดธเดเดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเตเดฑเต เดฑเดฟเดธเตเดตเต เดชเดพเดเตเดเดฑเตเดฑเต เดฐเตเดคเดฟเดฏเดฟเดฒเตเดเตเดเต เดเตเดฎเดพเดฑเตเดจเตเดจเต เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เดฒเดญเดฟเดเตเดเต
เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดญเดพเดเดคเตเดคเต เดเดฐเต เดเดฃเดเตเดทเตป เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเต:
private void EndReceive(IAsyncResult ar)
{
// ...
// ะฟะฐะบะตั ะฟะพะปััะตะฝ
// ะฟะฐััะธะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตัะฐ
ReliableUdpHeader header;
if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
{
// ะฟัะธัะตะป ะฝะตะบะพััะตะบัะฝัะน ะฟะฐะบะตั - ะพัะฑัะฐััะฒะฐะตะผ ะตะณะพ
return;
}
// ะบะพะฝััััะธััะตะผ ะบะปัั ะดะปั ะพะฟัะตะดะตะปะตะฝะธั connection recordโะฐ ะดะปั ะฟะฐะบะตัะฐ
Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
// ะฟะพะปััะฐะตะผ ัััะตััะฒััััั connection record ะธะปะธ ัะพะทะดะฐะตะผ ะฝะพะฒัั
ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header. ReliableUdpMessageType));
// ะทะฐะฟััะบะฐะตะผ ะฟะฐะบะตั ะฒ ะพะฑัะฐะฑะพัะบั ะฒ ะบะพะฝะตัะฝัะน ะฐะฒัะพะผะฐั
record.State.ReceivePacket(record, header, bytes);
}
เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเต เดธเตเดตเตเดเดฐเดฟเดเตเดเต เดเดฐเต เด เดเดเตเดเดพเดฐเด เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต (เดเดฆเตเดฏเดชเดพเดเตเดเดฑเตเดฑเต เดธเตเดตเตเดเดฐเดฟเดเตเด เด เดตเดธเตเดฅ):
public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
// ะพัะฑัะฐััะฒะฐะตะผ ะฟะฐะบะตั
return;
// ...
// by design ะฒัะต packet numbers ะฝะฐัะธะฝะฐัััั ั 0;
if (header.PacketNumber != 0)
return;
// ะธะฝะธัะธะฐะปะธะทะธััะตะผ ะผะฐััะธะฒ ะดะปั ั
ัะฐะฝะตะฝะธั ัะฐััะตะน ัะพะพะฑัะตะฝะธั
ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
// ะทะฐะฟะธััะฒะฐะตะผ ะดะฐะฝะฝัะต ะฟะฐะบะตั ะฒ ะผะฐััะธะฒ
ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
// ััะธัะฐะตะผ ะบะพะป-ะฒะพ ะฟะฐะบะตัะพะฒ, ะบะพัะพััะต ะดะพะปะถะฝั ะฟัะธะนัะธ
connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
// ะทะฐะฟะธััะฒะฐะตะผ ะฝะพะผะตั ะฟะพัะปะตะดะฝะตะณะพ ะฟะพะปััะตะฝะฝะพะณะพ ะฟะฐะบะตัะฐ (0)
connectionRecord.RcvCurrent = header.PacketNumber;
// ะฟะพัะปะต ัะดะฒะธะฝัะปะธ ะพะบะฝะพ ะฟัะธะตะผะฐ ะฝะฐ 1
connectionRecord.WindowLowerBound++;
// ะฟะตัะตะบะปััะฐะตะผ ัะพััะพัะฝะธะต
connectionRecord.State = connectionRecord.Tcb.States.Assembling;
if (/*ะตัะปะธ ะฝะต ััะตะฑัะตััั ะผะตั
ะฐะฝะธะทะผ ะฟะพะดัะฒะตัะถะดะตะฝะธะต*/)
// ...
else
{
// ะพัะฟัะฐะฒะปัะตะผ ะฟะพะดัะฒะตัะถะดะตะฝะธะต
ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}
}
เดเตเดกเดฟเดฒเตเดเตเดเต เดเดดเดคเตเดคเดฟเตฝ. เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดฎเตเดชเตเตพ เดเดฃเดเตเดทเตป เดเตเดฒเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเต
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดฏเตเดกเดฟเดชเดฟเดฏเตเดเต เดเดฐเต เดชเตเดฐเดงเดพเดจ เดญเดพเดเดฎเดพเดฃเต เดเตเดเดเดเตเดเต เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตฝ. เดเดฐเต เดเดจเตเดฑเตผเดฎเตเดกเดฟเดฏเดฑเตเดฑเต เดจเตเดกเต เดชเดฐเดพเดเดฏเดชเตเดชเตเดเตเดเดฏเตเด เดฐเดฃเตเดเต เดฆเดฟเดถเดเดณเดฟเดฒเตเดฎเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดกเตเดฒเดฟเดตเดฑเดฟ เด
เดธเดพเดงเตเดฏเดฎเดพเดตเตเดเดฏเตเด เดเตเดฏเตเดค เดเดฐเต เดเดฆเดพเดนเดฐเดฃเด เดชเดฐเดฟเดเดฃเดฟเดเตเดเตเด.
เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดฎเตเดชเตเตพ เดเดฐเต เดเดฃเดเตเดทเตป เด
เดเดฏเตเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดกเดฏเดเตเดฐเด:
เดกเดฏเดเตเดฐเดพเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดพเดฃเดพเตป เดเดดเดฟเดฏเตเดจเตเดจเดคเต เดชเตเดฒเต, เดเดฐเต เดฌเตเดฒเตเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เด
เดฏเดเตเดเดคเดฟเดจเต เดถเตเดทเด เด
เดฏเดเตเดเดฏเดพเดณเตเดเต เดตเตผเดเตเดเต เดเตเดฎเตผ เดเดเตป เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต. เดธเดเดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเตเดฑเต SendPacket เดฐเตเดคเดฟเดฏเดฟเดฒเดพเดฃเต เดเดคเต เดธเดเดญเดตเดฟเดเตเดเตเดจเตเดจเดคเต เด
เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ.
เดตเตผเดเตเดเต เดเตเดฎเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเตเดจเตเดจเต (เด
เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ เดจเดฟเดฒ):
public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
// ะพัะฟัะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตัะพะฒ
// ...
// ะฟะตัะตะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตั ะฟะพัะปะต ะพัะฟัะฐะฒะบะธ
connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
if ( connectionRecord.CloseWaitTimer != null )
connectionRecord.CloseWaitTimer.Change( -1, -1 );
}
เดเดฃเดเตเดทเตป เดธเตเดทเตเดเดฟเดเตเดเตเดฎเตเดชเตเตพ เดเตเดฎเตผ เดชเดฟเดฐเตเดกเตเดเตพ เดธเดเตเดเตเดเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดกเดฟเดซเตเตพเดเตเดเต ShortTimerPeriod 5 เดธเตเดเตเดเตปเดกเดพเดฃเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ, เดเดคเต 1,5 เดธเตเดเตเดเตปเดกเดพเดฏเดฟ เดธเดเตเดเตเดเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต.
เดเดฐเต เดเตปเดเดฎเดฟเดเดเต เดเดฃเดเตเดทเดจเดพเดฏเดฟ, เด
เดตเดธเดพเดจ เดเตปเดเดฎเดฟเดเดเต เดกเดพเดฑเตเดฑเดพ เดชเดพเดเตเดเดฑเตเดฑเต เดฒเดญเดฟเดเตเดเดคเดฟเดจเต เดถเตเดทเด เดเตเดฎเตผ เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต, เดเดคเต เดธเดเดธเตเดฅเดพเดจเดคเตเดคเดฟเดจเตเดฑเต เดฑเดฟเดธเตเดตเตเดชเดพเดเตเดเดฑเตเดฑเต เดฐเตเดคเดฟเดฏเดฟเดฒเดพเดฃเต เดธเดเดญเดตเดฟเดเตเดเตเดจเตเดจเดคเต. เด
เดธเดเดฌเตเดฒเดฟเดเดเต
เดตเตผเดเตเดเต เดเตเดฎเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเตเดจเตเดจเต (เด
เดธเดเดฌเตเดฒเดฟเดเดเต เด
เดตเดธเตเดฅ):
public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
// ...
// ะฟะตัะตะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตัั
connectionRecord.TimerSecondTry = false;
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
if (connectionRecord.CloseWaitTimer != null)
connectionRecord.CloseWaitTimer.Change(-1, -1);
// ...
}
เดตเตผเดเตเดเดฟเดเดเต เดเตเดฎเดฑเดฟเดจเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดฎเตเดชเตเตพ เดเตปเดเดฎเดฟเดเดเต เดเดฃเดเตเดทเดจเดฟเตฝ เดเตเดเตเดคเตฝ เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดตเดจเตเดจเดฟเดฒเตเดฒ. เดเตเดฎเตผ เดเดซเดพเดเตเดเดฟ ProcessPackets เดฐเตเดคเดฟ เดตเดฟเดณเดฟเดเตเดเต, เด
เดตเดฟเดเต เดจเดทเตเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเดฃเตเดเตเดคเตเดคเดฟ, เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เด
เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เดเดฆเตเดฏเดฎเดพเดฏเดฟ เด
เดฏเดเตเดเต.
เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เด
เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เด
เดฏเดฏเตเดเตเดเตเดจเตเดจเต (เด
เดธเดเดฌเตเดฒเดฟเดเดเต เด
เดตเดธเตเดฅ):
public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
// ...
if (/*ะฟัะพะฒะตัะบะฐ ะฝะฐ ะฟะพัะตััะฝะฝัะต ะฟะฐะบะตัั */)
{
// ะพัะฟัะฐะฒะปัะตะผ ะทะฐะฟัะพัั ะฝะฐ ะฟะพะฒัะพัะฝัั ะดะพััะฐะฒะบั
// ัััะฐะฝะฐะฒะปะธะฒะฐะตะผ ัะฐะนะผะตั ะฒะพ ะฒัะพัะพะน ัะฐะท, ะดะปั ะฟะพะฒัะพัะฝะพะน ะฟะพะฟััะบะธ ะฟะตัะตะดะฐัะธ
if (!connectionRecord.TimerSecondTry)
{
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
connectionRecord.TimerSecondTry = true;
return;
}
// ะตัะปะธ ะฟะพัะปะต ะดะฒัั
ะฟะพะฟััะพะบ ััะฐะฑะฐััะฒะฐะฝะธะน WaitForPacketTimer
// ะฝะต ัะดะฐะปะพัั ะฟะพะปััะธัั ะฟะฐะบะตัั - ะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตั ะทะฐะฒะตััะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
StartCloseWaitTimer(connectionRecord);
}
else if (/*ะฟัะธัะตะป ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั ะธ ััะฟะตัะฝะฐั ะฟัะพะฒะตัะบะฐ */)
{
// ...
StartCloseWaitTimer(connectionRecord);
}
// ะตัะปะธ ack ะฝะฐ ะฑะปะพะบ ะฟะฐะบะตัะพะฒ ะฑัะป ะฟะพัะตััะฝ
else
{
if (!connectionRecord.TimerSecondTry)
{
// ะฟะพะฒัะพัะฝะพ ะพัััะปะฐะตะผ ack
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
connectionRecord.TimerSecondTry = true;
return;
}
// ะทะฐะฟััะบะฐะตะผ ัะฐะนะผะตั ะทะฐะฒะตััะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
StartCloseWaitTimer(connectionRecord);
}
}
TimerSecondTry เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดธเดเตเดเตเดเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต เดฏเดฅเดพเตผเดฅ. เดชเตเดฐเดตเตผเดคเตเดคเดจ เดเตเดฎเตผ เดชเตเดจเดฐเดพเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เด เดตเตเดฐเดฟเดฏเดฌเดฟเตพ เดเดคเตเดคเดฐเดตเดพเดฆเดฟเดฏเดพเดฃเต.
เด
เดฏเดเตเดเดฏเดพเดณเตเดเต เดญเดพเดเดคเตเดคเต, เดชเตเดฐเดตเตผเดคเตเดคเดจ เดเตเดฎเดฑเตเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเตเดเดฏเตเด เด
เดตเดธเดพเดจเด เด
เดฏเดเตเด เดชเดพเดเตเดเดฑเตเดฑเต เดตเตเดฃเตเดเตเด เด
เดฏเดฏเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดเดฃเดเตเดทเตป เดเตเดฒเตเดธเต เดเตเดฎเตผ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเตเดจเตเดจเต (เด
เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ เดจเดฟเดฒ):
public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
// ...
// ะพัะฟัะฐะฒะปัะตะผ ะฟะพะฒัะพัะฝะพ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั
// ...
// ะฒะบะปััะฐะตะผ ัะฐะนะผะตั CloseWait โ ะดะปั ะพะถะธะดะฐะฝะธั ะฒะพัััะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ะธะปะธ ะตะณะพ ะทะฐะฒะตััะตะฝะธั
StartCloseWaitTimer(connectionRecord);
}
เด
เดคเดฟเดจเตเดถเตเดทเด, เดเดเตเดเตเดเตเดฏเดฟเดเดเต เดเดฃเดเตเดทเดจเดฟเตฝ เดเดฃเดเตเดทเตป เดเตเดฒเตเดธเต เดเตเดฎเตผ เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต.
ReliableUdpState.StartCloseWaitTimer:
protected void StartCloseWaitTimer(ReliableUdpConnectionRecord connectionRecord)
{
if (connectionRecord.CloseWaitTimer != null)
connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
else
connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.LongTimerPeriod, -1);
}
เดเดฃเดเตเดทเตป เดเตเดฒเตเดธเต เดเตเดฎเตผ เดธเดฎเดฏเดชเดฐเดฟเดงเดฟ เดกเดฟเดซเตเตพเดเตเดเดพเดฏเดฟ 30 เดธเตเดเตเดเตปเดกเดพเดฃเต.
เดเตเดฑเดเตเดเต เดธเดฎเดฏเดคเตเดคเดฟเดจเต เดถเตเดทเด, เดธเตเดตเตเดเตผเดคเตเดคเดพเดตเดฟเดจเตเดฑเต เดตเดถเดคเตเดคเตเดณเตเดณ เดตเตผเดเตเดเดฟเดเดเต เดเตเดฎเตผ เดตเตเดฃเตเดเตเด เดซเดฏเตผ เดเตเดฏเตเดฏเตเดจเตเดจเต, เด เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เดตเตเดฃเตเดเตเด เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต, เด เดคเดฟเดจเตเดถเตเดทเด เดเตปเดเดฎเดฟเดเดเต เดเดฃเดเตเดทเดจเดพเดฏเดฟ เดเดฃเดเตเดทเตป เดเตเดฒเตเดธเต เดเตเดฎเตผ เดเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต.
เดเตเดฒเตเดธเต เดเตเดฎเดฑเตเดเตพ เดซเดฏเตผ เดเตเดฏเตเดฏเตเดฎเตเดชเตเตพ, เดฐเดฃเตเดเต เดเดฃเดเตเดทเตป เดฑเตเดเตเดเตเตผเดกเตเดเดณเตเดเตเดฏเตเด เดเดฒเตเดฒเดพ เดเดฑเดตเดฟเดเดเตเดเดณเตเด เดฑเดฟเดฒเตเดธเต เดเตเดฏเตเดฏเตเด. เดกเตเดฒเดฟเดตเดฑเดฟ เดชเดฐเดพเดเดฏเด เด
เดชเตโเดธเตเดเตเดฐเตเด เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเดฟเดฒเตเดเตเดเต เด
เดฏเดเตเดเดฏเดพเตพ เดฑเดฟเดชเตเดชเตเตผเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเต (เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP API เดเดพเดฃเตเด).
เดเดฃเดเตเดทเตป เดฑเตเดเตเดเตเตผเดกเต เดเดฑเดตเดฟเดเดเตเดเตพ เดฑเดฟเดฒเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเต:
public void Dispose()
{
try
{
System.Threading.Monitor.Enter(this.LockerReceive);
}
finally
{
Interlocked.Increment(ref this.IsDone);
if (WaitForPacketsTimer != null)
{
WaitForPacketsTimer.Dispose();
}
if (CloseWaitTimer != null)
{
CloseWaitTimer.Dispose();
}
byte[] stream;
Tcb.IncomingStreams.TryRemove(Key, out stream);
stream = null;
Tcb.OutcomingStreams.TryRemove(Key, out stream);
stream = null;
System.Threading.Monitor.Exit(this.LockerReceive);
}
}
เดเตเดกเดฟเดฒเตเดเตเดเต เดเดดเดคเตเดคเดฟเตฝ. เดกเดพเดฑเตเดฑ เดเตเดฎเดพเดฑเตเดฑเด เดชเตเดจเดเดธเตเดฅเดพเดชเดฟเดเตเดเตเดจเตเดจเต
เดชเดพเดเตเดเดฑเตเดฑเต เดจเดทเตเดเดชเตเดชเตเดเตเดเดพเตฝ เดกเดพเดฑเตเดฑเดพ เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดตเตเดฃเตเดเตเดเตเดเตเดเตฝ เดกเดฏเดเตเดฐเด:
เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดฎเตเดชเตเตพ เดเดฃเดเตเดทเตป เด
เดเดฏเตเดเตเดเตเดจเตเดจเดคเดฟเตฝ เดเดคเดฟเดจเดเด เดเตผเดเตเด เดเตเดฏเตเดคเดคเตเดชเตเดฒเต, เดชเตเดฐเดตเตผเดคเตเดคเดจ เดเตเดฎเตผ เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดฎเตเดชเตเตพ, เดจเดทเตเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดฑเดฟเดธเตเดตเตผ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเด. เดชเดพเดเตเดเดฑเตเดฑเต เดจเดทเตโเดเดชเตเดชเตเดเตเดเดพเตฝ, เดธเตเดตเตเดเตผเดคเตเดคเดพเดตเดฟเดจเต เดเดคเตเดคเดพเดคเตเดค เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเดเต เดเดฃเตเดฃเดคเตเดคเดฟเดจเตเดฑเต เดเดฐเต เดฒเดฟเดธเตเดฑเตเดฑเต เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเด. เด เดจเดฎเตเดชเดฑเตเดเตพ เดเดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดเดฃเดเตเดทเดจเตเดฑเต LostPackets เด
เดฑเตเดฏเดฟเตฝ เดจเตฝเดเตเดเดฏเตเด เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด
เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เด
เดฏเดฏเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
เดชเดพเดเตเดเตเดเตเดเตพ เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเตผ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เด
เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ เด
เดฏเดฏเตเดเตเดเตเดจเตเดจเต (เด
เดธเดเดฌเตเดฒเดฟเดเดเต เด
เดตเดธเตเดฅ):
public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
//...
if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
{
// ะตััั ะฟะพัะตััะฝะฝัะต ะฟะฐะบะตัั, ะพัััะปะฐะตะผ ะทะฐะฟัะพัั ะฝะฐ ะฝะธั
foreach (int seqNum in connectionRecord.LostPackets)
{
if (seqNum != 0)
{
ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
}
}
// ...
}
}
เด
เดฏเดเตเดเดฏเดพเตพ เดตเตเดฃเตเดเตเด เดกเตเดฒเดฟเดตเดฑเดฟ เด
เดญเตเดฏเตผเดคเตเดฅเดจ เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดเดฏเตเด เดจเดทเตโเดเดฎเดพเดฏ เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เด
เดฏเดฏเตเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด. เด เดจเดฟเดฎเดฟเดทเดคเตเดคเดฟเตฝ, เด
เดฏเดเตเดเดฏเดพเตพ เดเดคเดฟเดจเดเด เดคเดจเตเดจเต เดเดฃเดเตเดทเตป เดเตเดฒเตเดธเต เดเตเดฎเตผ เดเดฐเดเดญเดฟเดเตเดเดฟเดเตเดเตเดฃเตเดเตเดจเตเดจเตเด เดเดฐเต เด
เดญเตเดฏเตผเดคเตเดฅเดจ เดฒเดญเดฟเดเตเดเตเดฎเตเดชเตเตพ เด
เดคเต เดชเตเดจเดเดธเดเตเดเดฎเดพเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเตเด เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเดฃเตเดเดคเดพเดฃเต.
เดจเดทเตเดเดชเตเดชเตเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดตเตเดฃเตเดเตเด เด
เดฏเดฏเตโเดเตเดเตเดจเตเดจเต (เด
เดฏเดเตเดเตเดจเตเดจ เดธเตเดเตเดเดฟเตพ เดจเดฟเดฒ):
public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
// ...
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
// ัะฑัะพั ัะฐะนะผะตัะฐ ะทะฐะบัััะธั ัะพะตะดะธะฝะตะฝะธั
if (connectionRecord.CloseWaitTimer != null)
connectionRecord.CloseWaitTimer.Change(-1, -1);
// ...
// ััะพ ะทะฐะฟัะพั ะฝะฐ ะฟะพะฒัะพัะฝัั ะฟะตัะตะดะฐัั โ ะพัะฟัะฐะฒะปัะตะผ ััะตะฑัะตะผัะน ะฟะฐะบะตั
else
ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}
เดฑเตเดธเตเดจเตเดฑเต เดชเดพเดเตเดเดฑเตเดฑเต (เดกเดฏเดเตเดฐเดพเดฎเดฟเดฒเต เดชเดพเดเตเดเดฑเตเดฑเต #3) เดเตปเดเดฎเดฟเดเดเต เดเดฃเดเตเดทเดจเดฟเดฒเตเดเต เดฒเดญเดฟเดเตเดเตเดจเตเดจเต. เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดเดพเดฒเดเด เดจเดฟเดฑเดเตเดเดฟเดเตเดเตเดฃเตเดเต เดเดจเตเดจเตเด เดธเดพเดงเดพเดฐเดฃ เดกเดพเดฑเตเดฑเดพ เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดชเตเดจเดเดธเตเดฅเดพเดชเดฟเดเตเดเดฟเดเตเดเตเดฃเตเดเต เดเดจเตเดจเตเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเตป เดเดฐเต เดชเดฐเดฟเดถเตเดงเดจ เดจเดเดคเตเดคเตเดจเตเดจเต.
เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจ เดตเดฟเตปเดกเตเดฏเดฟเดฒเต เดนเดฟเดฑเตเดฑเตเดเตพเดเตเดเดพเดฏเดฟ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต (เด
เดธเดเดฌเตเดฒเดฟเดเดเต เด
เดตเดธเตเดฅ):
public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
// ...
// ัะฒะตะปะธัะธะฒะฐะตะผ ััะตััะธะบ ะฟะฐะบะตัะพะฒ
connectionRecord.PacketCounter++;
// ะทะฐะฟะธััะฒะฐะตะผ ะฒ ะผะฐััะธะฒ ัะฟัะฐะฒะปะตะฝะธั ะพะบะฝะพะผ ัะตะบััะธะน ะฝะพะผะตั ะฟะฐะบะตัะฐ
connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
// ัััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐะธะฑะพะปััะธะน ะฟัะธัะตะดัะธะน ะฟะฐะบะตั
if (header.PacketNumber > connectionRecord.RcvCurrent)
connectionRecord.RcvCurrent = header.PacketNumber;
// ะฟะตัะตะทะฐะฟััะบะฐะผ ัะฐะนะผะตัั
connectionRecord.TimerSecondTry = false;
connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
if (connectionRecord.CloseWaitTimer != null)
connectionRecord.CloseWaitTimer.Change(-1, -1);
// ...
// ะตัะปะธ ะฝะฐะผ ะฟัะธัะปะธ ะฒัะต ะฟะฐะบะตัั ะพะบะฝะฐ, ัะพ ัะฑัะฐััะฒะฐะตะผ ััะตััะธะบ
// ะธ ะฒัััะปะฐะตะผ ะฟะฐะบะตั ะฟะพะดัะฒะตัะถะดะตะฝะธะต
else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
{
// ัะฑัะฐััะฒะฐะตะผ ััะตััะธะบ.
connectionRecord.PacketCounter = 0;
// ัะดะฒะธะฝัะปะธ ะพะบะฝะพ ะฟะตัะตะดะฐัะธ
connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
// ะพะฑะฝัะปะตะฝะธะต ะผะฐััะธะฒะฐ ัะฟัะฐะฒะปะตะฝะธั ะฟะตัะตะดะฐัะตะน
connectionRecord.WindowControlArray.Nullify();
ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
}
// ...
}
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ UDP API
เดกเดพเดฑเตเดฑเดพ เดเตเดฐเดพเตปเดธเตเดซเตผ เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเตเดฎเดพเดฏเดฟ เดธเดเดตเดฆเดฟเดเตเดเดพเตป, เดเดฐเต เดคเตเดฑเดจเตเดจ เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ Udp เดเตเดฒเดพเดธเต เดเดฃเตเดเต, เด เดคเต เดเตเดฐเดพเตปเดธเตเดซเตผ เดเตบเดเตเดฐเตเตพ เดฌเตเดฒเตเดเตเดเดฟเดจเต เดฎเตเดเดณเดฟเดฒเตเดณเตเดณ เดเดฐเต เดฑเดพเดชเตเดชเดฑเดพเดฃเต. เดเตเดฒเดพเดธเดฟเดฒเต เดเดฑเตเดฑเดตเตเด เดชเตเดฐเดงเดพเดจเดชเตเดชเตเดเตเด เด เดเดเดเตเดเตพ เดเดคเดพ:
public sealed class ReliableUdp : IDisposable
{
// ะฟะพะปััะฐะตั ะปะพะบะฐะปัะฝัั ะบะพะฝะตัะฝัั ัะพัะบั
public IPEndPoint LocalEndpoint
// ัะพะทะดะฐะตั ัะบะทะตะผะฟะปัั ReliableUdp ะธ ะทะฐะฟััะบะฐะตั
// ะฟัะพัะปััะธะฒะฐะฝะธะต ะฒั
ะพะดััะธั
ะฟะฐะบะตัะพะฒ ะฝะฐ ัะบะฐะทะฐะฝะฝะพะผ IP ะฐะดัะตัะต
// ะธ ะฟะพััั. ะะฝะฐัะตะฝะธะต 0 ะดะปั ะฟะพััะฐ ะพะทะฝะฐัะฐะตั ะธัะฟะพะปัะทะพะฒะฐะฝะธะต
// ะดะธะฝะฐะผะธัะตัะบะธ ะฒัะดะตะปะตะฝะฝะพะณะพ ะฟะพััะฐ
public ReliableUdp(IPAddress localAddress, int port = 0)
// ะฟะพะดะฟะธัะบะฐ ะฝะฐ ะฟะพะปััะตะฝะธะต ะฒั
ะพะดััะธั
ัะพะพะฑัะตะฝะธะน
public ReliableUdpSubscribeObject SubscribeOnMessages(ReliableUdpMessageCallback callback, ReliableUdpMessageTypes messageType = ReliableUdpMessageTypes.Any, IPEndPoint ipEndPoint = null)
// ะพัะฟะธัะบะฐ ะพั ะฟะพะปััะตะฝะธั ัะพะพะฑัะตะฝะธะน
public void Unsubscribe(ReliableUdpSubscribeObject subscribeObject)
// ะฐัะธะฝั
ัะพะฝะฝะพ ะพัะฟัะฐะฒะธัั ัะพะพะฑัะตะฝะธะต
// ะัะธะผะตัะฐะฝะธะต: ัะพะฒะผะตััะธะผะพััั ั XP ะธ Server 2003 ะฝะต ัะตััะตััั, ั.ะบ. ะธัะฟะพะปัะทัะตััั .NET Framework 4.0
public Task<bool> SendMessageAsync(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, CancellationToken cToken)
// ะฝะฐัะฐัั ะฐัะธะฝั
ัะพะฝะฝัั ะพัะฟัะฐะฒะบั ัะพะพะฑัะตะฝะธั
public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)
// ะฟะพะปััะธัั ัะตะทัะปััะฐั ะฐัะธะฝั
ัะพะฝะฝะพะน ะพัะฟัะฐะฒะบะธ
public bool EndSendMessage(IAsyncResult asyncResult)
// ะพัะธััะธัั ัะตััััั
public void Dispose()
}
เดธเดฌเตเดธเตเดเตเดฐเดฟเดชเตเดทเตป เดตเดดเดฟเดฏเดพเดฃเต เดธเดจเตเดฆเตเดถเดเตเดเตพ เดฒเดญเดฟเดเตเดเตเดจเตเดจเดคเต. เดเตเตพเดฌเดพเดเตเดเต เดฐเตเดคเดฟเดฏเตเดเต เดชเตเดฐเดคเดฟเดจเดฟเดงเดฟ เดเดชเตเดชเต:
public delegate void ReliableUdpMessageCallback( ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteClient );
เดธเดจเตเดฆเตเดถเด:
public class ReliableUdpMessage
{
// ัะธะฟ ัะพะพะฑัะตะฝะธั, ะฟัะพััะพะต ะฟะตัะตัะธัะปะตะฝะธะต
public ReliableUdpMessageTypes Type { get; private set; }
// ะดะฐะฝะฝัะต ัะพะพะฑัะตะฝะธั
public byte[] Body { get; private set; }
// ะตัะปะธ ัััะฐะฝะพะฒะปะตะฝะพ ะฒ true โ ะผะตั
ะฐะฝะธะทะผ ะฟะพะดัะฒะตัะถะดะตะฝะธั ะดะพััะฐะฒะบะธ ะฑัะดะตั ะพัะบะปััะตะฝ
// ะดะปั ะฟะตัะตะดะฐัะธ ะบะพะฝะบัะตัะฝะพะณะพ ัะพะพะฑัะตะฝะธั
public bool NoAsk { get; private set; }
}
เดเดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโเด เดธเดจเตเดฆเตเดถ เดคเดฐเดคเตเดคเดฟเดฒเตเดเตเดเตเด/เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโเด เด เดฏเดเตเดเดฏเดพเดณเดฟเดฒเตเดเตเดเตเด เดธเดฌเตโเดธเตโเดเตเดฐเตเดฌเตเดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดฐเดฃเตเดเต เดเดชเตโเดทเดฃเตฝ เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเต: ReliableUdpMessageTypes messageType, IPEndPoint ipEndPoint.
เดธเดจเตเดฆเตเดถ เดคเดฐเดเตเดเตพ:
public enum ReliableUdpMessageTypes : short
{
// ะัะฑะพะต
Any = 0,
// ะะฐะฟัะพั ะบ STUN server
StunRequest = 1,
// ะัะฒะตั ะพั STUN server
StunResponse = 2,
// ะะตัะตะดะฐัะฐ ัะฐะนะปะฐ
FileTransfer =3,
// ...
}
เดธเดจเตเดฆเตเดถเด เด เดธเดฎเดจเตเดตเดฟเดคเดฎเดพเดฏเดฟ เด เดฏเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต; เดเดคเดฟเดจเดพเดฏเดฟ, เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดเดฐเต เด เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดฎเตเดกเตฝ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต:
public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)
เดเดฐเต เดธเดจเตเดฆเตเดถเด เด เดฏเดฏเตโเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดฑเต เดซเดฒเด เดถเดฐเดฟเดฏเดพเดเตเด - เดธเดจเตเดฆเตเดถเด เดธเตเดตเตเดเตผเดคเตเดคเดพเดตเดฟเตฝ เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏเดฟ เดเดคเตเดคเดฟเดฏเดพเตฝ เดคเตเดฑเตเดฑเตเด - เดเดพเดฒเดนเดฐเดฃเดชเตเดชเตเดเตเดเต เดเดฃเดเตเดทเตป เด เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเดเตเดเตเดเดฟเตฝ:
public bool EndSendMessage(IAsyncResult asyncResult)
เดคเตเดฐเตเดฎเดพเดจเด
เด เดฒเตเดเดจเดคเตเดคเดฟเตฝ เดชเดฒเดคเตเด เดตเดฟเดตเดฐเดฟเดเตเดเดฟเดเตเดเดฟเดฒเตเดฒ. เดคเตเดฐเตเดกเต เดฎเดพเดเตเดเดฟเดเดเต เดฎเตเดเตเดเดพเดจเดฟเดธเดเตเดเตพ, เดเดดเดฟเดตเดพเดเตเดเดฒเตเด เดชเดฟเดถเดเต เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเดฒเตเด, เด เดธเดฟเตปเดเตเดฐเดฃเดธเต เดธเดจเตเดฆเตเดถเดฎเดฏเดฏเตเดเตเดเตฝ เดฐเตเดคเดฟเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ. เดเดจเตเดจเดพเตฝ เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เดเดพเดคเตฝ, เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด เดเดฐเต เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดธเดฎเดฏเดชเดฐเดฟเดงเดฟเดเตพ เดเตเดเดพเดฐเตเดฏเด เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เดฏเตเดเตเดคเดฟเดฏเตเดเต เดตเดฟเดตเดฐเดฃเด เดจเดฟเดเตเดเตพเดเตเดเต เดตเตเดฏเดเตเดคเดฎเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเด.
เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดกเตเดฒเดฟเดตเดฑเดฟ เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเดเตเด เดชเดคเดฟเดชเตเดชเต เดฎเตเดฎเตเดชเต เดจเดฟเตผเดตเดเดฟเดเตเด เดเดตเดถเตเดฏเดเดคเดเตพ เดจเดฟเดฑเดตเตเดฑเตเดฑเดพเตป เดชเดฐเตเดฏเดพเดชเตเดคเดตเตเด เดตเดดเดเตเดเดฎเตเดณเตเดณเดคเตเดฎเดพเดฃเต. เดเดจเตเดจเดพเตฝ เดตเดฟเดตเดฐเดฟเดเตเด เดจเดเดชเตเดชเดพเดเตเดเตฝ เดฎเตเดเตเดเดชเตเดชเตเดเตเดคเตเดคเดพเตป เดเดดเดฟเดฏเตเดฎเตเดจเตเดจเต เดเดพเตป เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดคเตเดฐเตเดชเตเดเตเดเต เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเด เดเตเดฎเตผ เดเดพเดฒเดฏเดณเดตเตเดเตพ เดเดฒเดจเดพเดคเตเดฎเดเดฎเดพเดฏเดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเตเด, เดธเตเดฒเตเดกเดฟเดเดเต เดตเดฟเตปเดกเต, RTT เดชเตเดฒเตเดณเตเดณ เดฎเตเดเตเดเดพเดจเดฟเดธเดเตเดเตพ เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดฒเตเดเตเดเต เดเตเตผเดเตเดเดพเตป เดเดดเดฟเดฏเตเด, เดเดฃเดเตเดทเตป เดจเตเดกเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ MTU เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดธเดเดตเดฟเดงเดพเดจเด เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดพเดจเตเด เดเดคเต เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดเตเด (เดชเดเตเดทเต เดตเดฒเดฟเดฏ เดธเดจเตเดฆเตเดถเดเตเดเตพ เด เดฏเดเตเดเดพเตฝ เดฎเดพเดคเตเดฐเด) .
เดจเดฟเดเตเดเดณเตเดเต เดถเตเดฐเดฆเตเดงเดฏเตเดเตเดเต เดจเดจเตเดฆเดฟ, เดจเดฟเดเตเดเดณเตเดเต เด เดญเดฟเดชเตเดฐเดพเดฏเดเตเดเดณเตเด เด เดญเดฟเดชเตเดฐเดพเดฏเดเตเดเดณเตเด เดเดพเตป เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเตเดจเตเดจเต.
PS เดตเดฟเดถเดฆเดพเดเดถเดเตเดเดณเดฟเตฝ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณ เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเดตเตผเดเตเดเต, GitHube-เดฒเต เดชเตเดฐเตเดเดเตเดฑเตเดฑเดฟเดฒเตเดเตเดเตเดณเตเดณ เดฒเดฟเดเตเดเต:
เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดฏ เดฒเดฟเดเตเดเตเดเดณเตเด เดฒเตเดเดจเดเตเดเดณเตเด
- TCP เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดธเตเดชเตเดธเดฟเดซเดฟเดเตเดเตเดทเตป:
เดเดเดเตเดฒเดฟเดทเดฟเดฒเต ะธเดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเตฝ - UDP เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ เดธเตเดชเตเดธเดฟเดซเดฟเดเตเดเตเดทเตป:
เดเดเดเตเดฒเดฟเดทเดฟเดฒเต ะธเดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเตฝ - RUDP เดชเตเดฐเตเดเตเดเตเดเตเดเตเดณเดฟเดจเตเดฑเต เดเตผเดเตเด:
draft-ietf-sigtran-reliable-udp-00 - เดตเดฟเดถเตเดตเดธเดจเตเดฏเดฎเดพเดฏ เดกเดพเดฑเตเดฑ เดชเตเดฐเตเดเตเดเตเดเตเดเตเตพ:
เดเตผเดเดซเตเดธเดฟ 908 ะธเดเตผเดเดซเตเดธเดฟ 1151 - เดฏเตเดกเดฟเดชเดฟ เดตเดดเดฟเดฏเตเดณเตเดณ เดกเตเดฒเดฟเดตเดฑเดฟ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดจเดเดชเตเดชเดพเดเตเดเตฝ:
.NET, UDP เดเดจเตเดจเดฟเดต เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดฟเดเตเดเดณเตเดเต เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเดฟเดเดเดฟเดจเตเดฑเต เดชเตเตผเดฃเตเดฃ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด เดเดฑเตเดฑเตเดเตเดเตเดเตเด - NAT เดเตเดฐเดพเดตเตเดดเตเดธเตฝ เดฎเตเดเตเดเดพเดจเดฟเดธเดเตเดเตพ เดตเดฟเดตเดฐเดฟเดเตเดเตเดจเตเดจ เดฒเตเดเดจเด:
เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดตเดฟเดฒเดพเดธเด เดตเดฟเดตเตผเดคเตเดคเดเดฐเดฟเดฒเตเดเดจเตเดณเด เดชเดฟเดฏเตผ-เดเต-เดชเดฟเดฏเตผ เดเดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด - เด
เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดฎเตเดกเตฝ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตฝ:
CLR เด เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดฎเตเดกเตฝ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต ะธIAsyncResult เดกเดฟเดธเตเตป เดชเดพเดฑเตเดฑเตเตบ เดเดเตเดเดจเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดพเด - เด
เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเต เดฎเตเดกเตฝ เดเดพเดธเตโเดเต เด
เดงเดฟเดทเตโเด เดฟเดค เด
เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเดพเดฑเตเดฑเตเดฃเดฟเดฒเตเดเตเดเต (TAP-เดฒเต APM) เดชเตเตผเดเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเต:
TPL เดเด เดชเดฐเดฎเตเดชเดฐเดพเดเดค .NET เด เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเตเดฐเตเดเตเดฐเดพเดฎเดฟเดเดเตเด
เดฎเดฑเตเดฑเต เด เดธเดฟเตปเดเตเดฐเดฃเดธเต เดชเดพเดฑเตเดฑเตเดฃเตเดเดณเตเด เดคเดฐเดเตเดเดณเตเด เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเดชเตเดเตเด
เด
เดชเตเดกเตเดฑเตเดฑเต: เดจเดจเตเดฆเดฟ
เด
เดตเดฒเดเดฌเด: www.habr.com