αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αž’αŸŠαž·αž“αž’αžΊαžŽαž·αžαž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‡αžΆαž™αžΌαžšαž˜αž€αž αžΎαž™αŸ” αž–αž·αž’αžΈαž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αž“αŸƒαž’αŸŠαžΈαž“αž’αžΊαžŽαž·αž - UDP αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αž·αž“αžαŸ’αžšαžΉαž˜αžαŸ‚αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž“αž·αž„αž€αžΆαžšαž…αžΆαž€αŸ‹αž•αŸ’αžŸαžΆαž™αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ‚αž˜αž‘αžΆαŸ†αž„αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ "αž–αžΈαž˜αž½αž™αž‘αŸ…αž˜αž½αž™" αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αž”αžŽαŸ’αžαžΆαž‰αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž€αžΆαžšαžšαž…αž“αžΆαžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αžšαž”αžŸαŸ‹αžœαžΆ αž–αž·αž’αžΈαž€αžΆαžšαž“αŸαŸ‡αž˜αžΆαž“αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αž‚αŸ’αžšαŸ„αž„αž‘αž»αž€αž–αžΈαž˜αž»αž“αž˜αž€ αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž—αžΆαž–αžαŸ’αžœαŸ‡αžαžΆαžαž“αŸƒαž–αž·αž’αžΈαž€αžΆαžš αžŠαžΌαž…αž‡αžΆαž€αž„αŸ’αžœαŸ‡αž€αžΆαžšαž’αžΆαž“αžΆαž˜αž·αž“αž”αžΆαžαŸ‹αž‘αŸ…αžŽαžΆαž‘αžΎαž™αŸ” αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž’αžΆαž“αžΆαž›αžΎ UDP αŸ”
αž˜αžΆαžαž·αž€αžΆ:αž’αžΆαžαž»
αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž–αž·αž’αžΈαžŸαžΆαžš
αž€αŸ’αž”αžΆαž› UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ”
αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž‘αžΌαž‘αŸ…αž“αŸƒαž–αž·αž’αžΈαžŸαžΆαžš
αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž› αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžœαŸαž›αžΆαž–αž·αž’αžΈαž€αžΆαžš
αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž‰αŸ’αž‡αžΌαž“ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ”
αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αž’αž„αŸ’αž‚αž—αžΆαž–αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“
αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αžšαžŠαŸ’αž‹

αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹
αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αž€αžΆαžšαž”αž·αž‘αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸ…αž–αŸαž›αž’αžŸαŸ‹αž–αŸαž›
αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αž€αžΆαžšαžŸαŸ’αžαžΆαžšαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™
UDP API αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ”
αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“
αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž’αžαŸ’αžαž”αž‘αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ

αž’αžΆαžαž»

αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αžŠαžΎαž˜αž“αŸƒαž’αŸŠαž·αž“αž’αžΊαžŽαž·αžαžŸαž“αŸ’αž˜αžαžαžΆαž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŠαžΌαž…αž‚αŸ’αž“αžΆ αžŠαŸ‚αž›αžαŸ’αž“αžΆαŸ†αž„αž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžŸαž€αž› αž“αž·αž„αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ αž αžΎαž™αž’αžΆαž…αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‡αžΆαž˜αž½αž™αžαŸ’αž“αžΆαŸ†αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸŠαž·αž“αž’αžΊαžŽαž·αžαžαžΆαž˜αž€αžΆαžšαž–αž·αžαž˜αžΆαž“αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αž‚αŸ’αž“αžΆ - αžαŸ†αž”αž“αŸ‹αž˜αž½αž™αž“αŸƒαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžŸαž€αž›αž“αž·αž„αžαŸ†αž”αž“αŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž˜αžΆαž“αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž―αž€αž‡αž“αž›αžΆαž€αŸ‹αž“αŸ…αž–αžΈαž€αŸ’αžšαŸ„αž™αž§αž”αž€αžšαžŽαŸ NAT αŸ”αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž“αŸαŸ‡ αž˜αžΆαž“αžαŸ‚αž§αž”αž€αžšαžŽαŸαž“αŸ…αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŸαž€αž›αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αž’αžΆαž…αž‘αžΆαž€αŸ‹αž‘αž„αž‡αžΆαž˜αž½αž™αž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αžŠαŸ„αž™αžŸαžΆαžšαž–αž½αž€αžœαžΆαž˜αžΆαž“αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αžŠαŸ‚αž›αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž‘αžΌαž‘αžΆαŸ†αž„αž–αž·αž—αž–αž›αŸ„αž€αŸ” αžαŸ’αž“αžΆαŸ†αž„αž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž―αž€αž‡αž“αž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αžαŸ‚αž˜αž½αž™ αž αžΎαž™αž€αŸαž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αž›αŸ’αž”αžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŸαž€αž›αž•αž„αžŠαŸ‚αžšαŸ” αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚αž™αž“αŸ’αžαž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αž”αžŽαŸ’αžαžΆαž‰αŸ” αž§αž”αž€αžšαžŽαŸ NAT αžŠαžΌαž…αž‡αžΆαžšαŸ‰αŸ„αžαž‘αŸαžš Wi-Fi αž”αž„αŸ’αž€αžΎαžαž’αžΆαžαž»αžαžΆαžšαžΆαž„αž”αž€αž”αŸ’αžšαŸ‚αž–αž·αžŸαŸαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αŸαž‰ αž“αž·αž„αž€αŸ‚αž”αŸ’αžšαŸ‚αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αž“αž·αž„αž›αŸαžαž…αŸ’αžšαž€αž€αŸ’αž“αž»αž„αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ” αž“αŸαŸ‡αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αŸαž‰αž–αžΈαž”αžŽαŸ’αžαžΆαž‰αž―αž€αž‡αž“αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŸαž€αž›αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸ…αž–αŸαž›αž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαž“αŸ„αŸ‡ αž§αž”αž€αžšαžŽαŸ NAT αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžšαžΆαžšαžΆαŸ†αž„αž…αžšαžΆαž…αžšαžŽαŸαž…αžΌαž›αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž›αž»αŸ‡αžαŸ’αžšαžΆαžαŸ‚αž˜αžΆαž“αž…αŸ’αž”αžΆαž”αŸ‹αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αžΌαž›αŸ”

αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž“αŸƒαž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαž“αŸαŸ‡αž‚αžΊαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž’αžαž·αžαž·αž‡αž“-αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ αžŠαŸ‚αž›αž’αžαž·αžαž·αž‡αž“αž’αžΆαž…αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αž―αž€αž‡αž“ αž αžΎαž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž˜αžΆαž“αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“αžŸαž€αž›αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžœαžΆαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαž›αŸ†αž”αžΆαž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸƒαžαŸ’αž“αžΆαŸ†αž„αž–αžΈαžšαžšαžœαžΆαž„ αž•αŸ’αžŸαŸαž„αŸ— αž”αžŽαŸ’αžαžΆαž‰αž―αž€αž‡αž“αŸ” αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αž–αžΈαžšαž‚αžΊαž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αžΈαž‚αŸ’αž“αžΆαž‘αŸ…αžœαž·αž‰αž‘αŸ…αž˜αž€αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαŸ†αž‘αŸαž„ (Skype) αž€αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžš (TeamViewer) αž¬αž αŸ’αž‚αŸαž˜αž’αž“αž‘αžΆαž‰αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαžŠαŸαž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž”αŸ†αž•αž»αžαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž–αžΈαž˜αž½αž™αž‘αŸ…αž˜αž½αž™αžšαžœαžΆαž„αž§αž”αž€αžšαžŽαŸαž“αŸ…αž›αžΎαž”αžŽαŸ’αžαžΆαž‰αž―αž€αž‡αž“αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαž€αžΆαžšαžŠαžΆαž›αŸ‹αžšαž“αŸ’αž’αŸ” αž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆαž‘αžΌαž‘αŸ…αž”αŸ†αž•αž»αžαž‡αžΆαž˜αž½αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž–αž·αž’αžΈαž€αžΆαžš UDP αŸ”

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αžΆαž˜αž‘αžΆαžšαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž’αžΆαž“αžΆ αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž’αŸ’αž“αž€αž•αŸ’αž‘αŸαžšαž―αž€αžŸαžΆαžšαžšαžœαžΆαž„αž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžš αž“αŸ„αŸ‡αž€αžΆαžšαž”αŸ’αžšαžΎ UDP αž“αžΉαž„αž˜αžΆαž“αž€αžΆαžšαž›αŸ†αž”αžΆαž€αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ UDP αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαž–αž·αž’αžΈαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž’αžΆαž“αžΆ αž αžΎαž™αž˜αž·αž“αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹αž›αŸ†αžŠαŸ„αž™ αž˜αž·αž“αžŠαžΌαž… TCP αž‘αŸαŸ” αž–αž·αž’αžΈαž€αžΆαžšαŸ”

αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαž”αžΆαž“αž“αžΌαžœαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžšαžŸαŸ’αžšαž‘αžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž˜αž»αžαž„αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎ UDP αŸ”

αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž—αŸ’αž›αžΆαž˜αŸ—αžαžΆαž˜αžΆαž“αž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαžŠαžΆαž›αŸ‹αžšαž“αŸ’αž’ TCP αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ TCP αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžŽαŸ’αžαžΆαž‰αž―αž€αž‡αž“αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ„αž™αžŸαžΆαžšαž€αžΆαžšαžαŸ’αžœαŸ‡αžαžΆαžαž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαžŠαŸ„αž™αž§αž”αž€αžšαžŽαŸ NAT αž‡αžΆαž…αŸ’αžšαžΎαž“ αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžœαžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž‡αžΆαžœαž·αž’αžΈαž…αž˜αŸ’αž”αž„αž€αŸ’αž“αž»αž„αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ” αžαŸ’αž“αžΆαŸ†αž„αž”αŸ‚αž”αž“αŸαŸ‡αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž•αŸ’αžαŸ„αžαžαŸ‚αž›αžΎαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž’αžΆαž“αžΆαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαžŠαžΆαž›αŸ‹αžšαž“αŸ’αž’ UDP αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ”

αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž–αž·αž’αžΈαžŸαžΆαžš

  1. αž€αžΆαžšαž•αŸ’αžαž›αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž’αžΆαž…αž‡αžΏαž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αžšαž™αŸˆαž™αž“αŸ’αžαž€αžΆαžšαž˜αžαž·αžαŸ’αžšαž‘αž”αŸ‹αžœαž·αž‡αŸ’αž‡αž˜αžΆαž“ (αž αŸ…αžαžΆαž€αžΆαžšαž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹αž‡αžΆαžœαž·αž‡αŸ’αž‡αž˜αžΆαž“)
  2. αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αŸ†αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– i.e. αž–αž·αž’αžΈαž€αžΆαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž‡αŸ€αžŸαžœαžΆαž„αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹
  3. αžœαžΆαž‚αž½αžšαžαŸ‚αž’αžΆαž…αž›αž»αž”αž…αŸ„αž›αž™αž“αŸ’αžαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ (αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆαž–αž·αž’αžΈαž€αžΆαžš UDP "αžŸαž»αž‘αŸ’αž’")
  4. αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžšαž”αŸ€αž”αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŠαŸ„αž™αž˜αžΆαž“αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž–αžΈαžŸαžΆαžšαž“αžΈαž˜αž½αž™αŸ—
  5. αž―αž€αžαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž›αžΎαž–αž·αž’αžΈαž€αžΆαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž‡αžΆαžŸαžΆαžš

αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžŸαŸ’αžšαž”αž‚αŸ’αž“αžΆαž“αžΉαž„αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž–αž·αž’αžΈαžŸαžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„ rfc ៑៑្៣ ΠΈ rfc αŸ‘αŸ‘αŸ’αŸ£αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž‘αžΆαŸ†αž„αž“αŸ„αŸ‡αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž–αž·αž’αžΈαž€αžΆαžšαž“αŸαŸ‡αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αž–αžΈαžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡ αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž–αŸαž›αžœαŸαž›αžΆαž“αŸƒαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αž”αžŽαŸ’αžαžΆαž‰αž–αžΈαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αž·αž’αžΈαž€αžΆαžš TCP αž“αž·αž„ UDP αŸ” αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž‘αžΆαŸ†αž„αž–αžΈαžšαž™αžΎαž„αž“αžΉαž„αž˜αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αž˜αž½αž™αž”αžΆαžαŸ‹αŸ”
αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž·αž“αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž›αžΎ TCPαŸ–αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž–αžΈαžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜ αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž”αžΆαžαŸ‹αž”αž„αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ TCP αž“αžΉαž„αžšαž€αžƒαžΎαž‰αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αžΆαžαŸ‹ αž αžΎαž™αžšαžΆαž™αž€αžΆαžšαžŽαŸαžœαžΆαž‘αŸ…αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαžŠαŸ„αž™αžŸαž½αžšαžšαž€αž…αŸ†αž“αž½αž“αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž”αžΆαžαŸ‹αŸ”
αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαžΆαž˜αžšαž™αŸˆαž–αž·αž’αžΈαž€αžΆαžš UDPαŸ–αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

UDP αž˜αž·αž“αž…αžΆαžαŸ‹αžœαž·αž’αžΆαž“αž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αžŽαžΆαž˜αž½αž™αž‘αžΎαž™αŸ” αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αŸ†αž αž»αžŸαž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž·αž’αžΈαž€αžΆαžš UDP αž‚αžΊαž‡αžΆαž€αžΆαžšαž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž€αžΆαžšαžšαž€αžƒαžΎαž‰αž€αŸ†αž αž»αžŸαž“αŸ…αž€αŸ’αž“αž»αž„αž–αž·αž’αžΈαž€αžΆαžš TCP αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αžŠαŸ„αž™αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αžαŸ’αž“αžΆαŸ†αž„αž”αž‰αŸ’αž…αž”αŸ‹ αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸ„αŸ‡ αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž…αŸ†αž“αž½αž“αž”αŸƒαžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‰αžΎαž“αŸ…αž€αŸ’αž“αž»αž„αž”αž‹αž˜αž€αžαžΆαž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž“αžΈαž˜αž½αž™αŸ— αž“αž·αž„αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž”αž„αŸ’αž€αžΆαž“αŸ‹αžŠαŸƒαžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αŸαžαž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹αŸ”

αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αž αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž (ឧ. αž•αŸ’αž‰αžΎαž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž˜αž½αž™αž•αŸ’αž“αŸ‚αž€αžŠαŸ„αž™αž˜αž·αž“αž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹) αž–αž·αž’αžΈαž€αžΆαžš TCP αž”αŸ’αžšαžΎαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αŸαž αŸ…αžαžΆ αž”αž„αŸ’αž’αž½αž…αž”αž‰αŸ’αž‡αžΌαž“ - αž…αŸ†αž“αž½αž“αž”αŸƒαž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαž“αŸƒαž•αŸ’αž“αŸ‚αž€αžšαŸ†αž–αžΉαž„αžαžΆαž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαž–αž·αž’αžΈαž€αžΆαžš TCP αžŸαžΌαž˜αž˜αžΎαž› rfc αŸ‘αŸ‘αŸ’αŸ£αž–αžΈ UDP αž‘αŸ… rfc αŸ‘αŸ‘αŸ’αŸ£αžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž‡αžΆαž€αžΆαžšαž–αž·αžαž–αž½αž€αž‚αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αŸ”

αž–αžΈαžαžΆαž„αž›αžΎ αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹αžαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž–αž·αž’αžΈαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž›αžΎ UDP (αžαž‘αŸ…αž“αŸαŸ‡αž αŸ…αžαžΆ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ”) αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž™αž“αŸ’αžαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαŸ’αžšαžŠαŸ€αž„αž“αžΉαž„ TCP αŸ” αž–αŸ„αž›αž‚αžΊαŸ–

  • αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹
  • αž”αŸ’αžšαžΎαž›αŸαžαžšαŸ€αž„αž•αŸ’αž“αŸ‚αž€
  • αž”αŸ’αžšαžΎαž€αž‰αŸ’αž…αž”αŸ‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž–αž·αžŸαŸαžŸ
  • αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαž”αžΎαž€αž”αž„αŸ’αž’αž½αž…αžŸαžΆαž˜αž‰αŸ’αž‰ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž–αž·αž’αžΈαž€αžΆαžš

αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡αž‘αŸ€αžαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžš:

  • αž‡αžΆαžŸαž‰αŸ’αž‰αžΆαž“αŸƒαž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŸαžΆαžš αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ‚αž„αž…αŸ‚αž€αž’αž“αž’αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹
  • αž•αŸ’αžαž›αŸ‹αžŸαž‰αŸ’αž‰αžΆαž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸƒαžŸαžΆαžš αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž‘αž‘αž½αž›αž‘αŸ…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž›αžΎ αž“αž·αž„αž”αž‰αŸ’αž…αŸαž‰αž’αž“αž’αžΆαž“αž–αž·αž’αžΈαž€αžΆαžš
  • αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž–αž·αž’αžΈαž€αžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž·αž‘αž™αž“αŸ’αžαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‡αžΆ UDP "αž”αžšαž·αžŸαž»αž‘αŸ’αž’"

αž€αŸ’αž”αžΆαž› UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ”

αžŸαžΌαž˜αž…αžΆαŸ†αžαžΆ UDP datagram αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž»αŸ†αž–αŸαž‘αŸ’αž’αž€αŸ’αž“αž»αž„ IP datagramαŸ” αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‡αžΏαž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“ "αžšαž»αŸ†" αž™αŸ‰αžΆαž„αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž‘αŸ…αž€αŸ’αž“αž»αž„ UDP datagram αŸ”
αž€αžΆαžšαžœαŸαž…αžαŸ’αž…αž”αŸ‹αž”αž‹αž˜αž€αžαžΆ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ–αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸƒαž”αž‹αž˜αž€αžαžΆ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‡αžΏαž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αžŽαžΆαžŸαŸ‹:

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

  • αž‘αž„αŸ‹αž‡αžΆαžαž· - αž‘αž„αŸ‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αž‰αŸ’αž…αž”αŸ‹
  • MessageType - αž”αŸ’αžšαž—αŸαž‘αžŸαžΆαžšαžŠαŸ‚αž›αž”αŸ’αžšαžΎαžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΆαž„αž›αžΎαžŠαžΎαž˜αŸ’αž”αžΈαž‡αžΆαžœαžŸαžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹
  • TransmissionId - αž…αŸ†αž“αž½αž“αž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“ αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αž…αŸ’αžšαž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž› αž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αŸ”
  • αž›αŸαžαž€αž‰αŸ’αž…αž”αŸ‹ - αž›αŸαžαž€αž‰αŸ’αž…αž”αŸ‹
  • αž‡αž˜αŸ’αžšαžΎαžŸ - αž‡αž˜αŸ’αžšαžΎαžŸαž–αž·αž’αžΈαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αŸ” αž€αŸ’αž“αž»αž„β€‹αž€αžšαžŽαžΈβ€‹αž“αŸƒβ€‹αž€αž‰αŸ’αž…αž”αŸ‹β€‹αž‘αžΈαž˜αž½αž™ αžœαžΆβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αž„αŸ’αž αžΆαž‰β€‹αž‘αŸ†αž αŸ†β€‹αž“αŸƒβ€‹αžŸαžΆαžš

αž‘αž„αŸ‹αž‡αžΆαžαž·αž˜αžΆαž“αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • FirstPacket - αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αž”αžΌαž„αž“αŸƒαžŸαžΆαžš
  • NoAsk - αžŸαžΆαžšαž˜αž·αž“αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αž™αž“αŸ’αžαž€αžΆαžšαž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸαŸ”
  • LastPacket - αž€αž‰αŸ’αž…αž”αŸ‹αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸƒαžŸαžΆαžš
  • RequestForPacket - αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αž¬αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αžΆαžαŸ‹

αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž‘αžΌαž‘αŸ…αž“αŸƒαž–αž·αž’αžΈαžŸαžΆαžš

αžŠαŸ„αž™αžŸαžΆαžš UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž‚αžΊαž•αŸ’αžαŸ„αžαž›αžΎαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαž’αžΆαž“αžΆαžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αž–αžΈαžš αžœαžΆαžαŸ’αžšαžΌαžœαžαŸ‚αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αž—αžΆαž‚αžΈαž˜αŸ’αžαžΆαž„αž‘αŸ€αžαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž˜αžΆαž“αž‘αž„αŸ‹ FirstPacket αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αžŠαŸ‚αž›αž“αžΉαž„αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αŸ” αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž†αŸ’αž›αžΎαž™αžαž”αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ αž¬αž“αž·αž™αžΆαž™αž˜αŸ’αž™αŸ‰αžΆαž„αž‘αŸ€αž αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹ αžαŸ‚αž„αžαŸ‚αž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαž“αŸƒαž”αŸ’αžšαž’αž”αŸ‹αž›αŸαžαž€αž‰αŸ’αž…αž”αŸ‹αž‘αŸ…αž˜αž½αž™αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αžαž˜αŸ’αž›αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž›αŸαžαž’αŸ†αž”αŸ†αž•αž»αžαž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ” αžœαžΆαž›αž‡αž˜αŸ’αžšαžΎαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‰αžΎαž‚αžΊαž‡αžΆαž‘αŸ†αž αŸ†αž“αŸƒαžŸαžΆαžšαŸ”

αž™αž“αŸ’αžαž€αžΆαžšαžŸαŸ’αžšαžŠαŸ€αž„αž‚αŸ’αž“αžΆαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αŸ” αž‘αž„αŸ‹ LastPacket αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž“αŸ…αž›αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸƒαžŸαžΆαžšαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž‰αŸ’αž…αž”αŸ‹αž†αŸ’αž›αžΎαž™αžαž” αž…αŸ†αž“αž½αž“αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž…αž»αž„αž€αŸ’αžšαŸ„αž™ + 1 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αŸ’αž’αž»αž›αž”αž„αŸ’αž αžΆαž‰ αžŠαŸ‚αž›αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αž‘αž‘αž½αž›αž˜αžΆαž“αž“αŸαž™αžαžΆαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ”
αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜β€‹αž€αžΆαžšβ€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž“αž·αž„β€‹αž€αžΆαžšβ€‹αž”αž‰αŸ’αž…αž”αŸ‹β€‹αž€αžΆαžšβ€‹αžαž—αŸ’αž‡αžΆαž”αŸ‹αŸ–αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„ αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‡αžΆαž”αžŽαŸ’αžαž»αŸ†αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ” αž”αŸ’αž›αž»αž€αž“αžΈαž˜αž½αž™αŸ— αž›αžΎαž€αž›αŸ‚αž„αžαŸ‚αž˜αž½αž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž˜αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž…αŸ†αž“αž½αž“αžαŸαžšαŸ” αžœαžΆαžŸαŸ’αž˜αžΎαž“αžΉαž„αž‘αŸ†αž αŸ†αž”αž„αŸ’αž’αž½αž…αž‘αž‘αž½αž›/αž”αž‰αŸ’αž‡αžΌαž“αŸ” αž”αŸ’αž›αž»αž€αž‘αž·αž“αŸ’αž“αž“αŸαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž’αžΆαž…αž˜αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžαž·αž…αž‡αžΆαž„αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž•αŸ’αž‰αžΎαž”αŸ’αž›αž»αž€αž“αžΈαž˜αž½αž™αŸ— αž—αžΆαž‚αžΈαž•αŸ’αž‰αžΎαžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“ αž¬αžŸαŸ†αžŽαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαžαŸ‹αžŸαžΆαžšαž‡αžΆαžαŸ’αž˜αžΈ αžŠαŸ„αž™αž‘αž»αž€αž±αŸ’αž™αž”αž„αŸ’αž’αž½αž…αž‘αž‘αž½αž›/αž”αž‰αŸ’αž‡αžΌαž“αž”αžΎαž€αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž–αžΈαž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“αž”αŸ’αž›αž»αž€ αž”αž„αŸ’αž’αž½αž…αž‘αž‘αž½αž›/αž”αž‰αŸ’αž‡αžΌαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž αžΎαž™αž”αŸ’αž›αž»αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαŸ”

αž—αžΆαž‚αžΈαž‘αž‘αž½αž›αž‘αž‘αž½αž›αž€αž‰αŸ’αž…αž”αŸ‹αŸ” αž€αž‰αŸ’αž…αž”αŸ‹αž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™ αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαžœαžΆαž’αŸ’αž›αžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž…αž”αž‰αŸ’αž‡αžΌαž“αž¬αž’αžαŸ‹αŸ” αž€αž‰αŸ’αž…αž”αŸ‹β€‹αž“αž·αž„β€‹αžŸαŸ’αž‘αž½αž“β€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αž’αŸ’αž›αžΆαž€αŸ‹β€‹αž…αžΌαž›β€‹αž€αŸ’αž“αž»αž„β€‹αž”αž„αŸ’αž’αž½αž…β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž…αŸ’αžšαŸ„αŸ‡β€‹αž…αŸαž‰αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžαŸ‚ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž‘αŸ†αž αŸ†αž“αŸƒαžœαž·αž“αžŠαžΌαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‡αž½αžŸαž‡αž»αž› αž αžΎαž™αžŠαžΌαž…αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž› αž“αž·αž„αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎ αž“αŸ„αŸ‡αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αž”αŸ’αž›αž»αž€αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αžŠαŸ„αž™αž˜αž·αž“αž”αžΆαžαŸ‹αž”αž„αŸ‹ αž“αŸ„αŸ‡αž”αž„αŸ’αž’αž½αž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžαžΌαžšαž‘αŸ…αž‘αž‘αž½αž›αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž“αŸƒαž”αŸ’αž›αž»αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™ αž αžΎαž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž’αŸ†αž–αžΈαž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“αž‚αžΊ αž”αžΆαž“αž•αŸ’αž‰αžΎαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαž·αž“αžŠαžΌαž˜αž·αž“αž”αŸ†αž–αŸαž‰αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž€αŸ†αžŽαžαŸ‹αžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž€αžΆαžšαž„αžΆαžšαž‘αŸ αž“αŸ„αŸ‡αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ‚αž›αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž˜αž·αž“αž‘αžΆαž“αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“ αž αžΎαž™αžŸαŸ†αžŽαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“αž‘αžΎαž„αžœαž·αž‰αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαŸ”
αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αžαŸ–αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž› αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžœαŸαž›αžΆαž–αž·αž’αžΈαž€αžΆαžš

αž˜αžΆαž“αž αŸαžαž»αž•αž›αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž·αž“αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž”αžΆαž“αŸ” αž§αž‘αžΆαž αžšαžŽαŸ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž—αžΆαž‚αžΈαž‘αž‘αž½αž›αž˜αž·αž“αž˜αžΆαž“αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž“αŸ…αž–αŸαž›αž–αŸ’αž™αžΆαž™αžΆαž˜αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘αžŠαŸ„αž™αž’αžŸαŸ‹αž–αŸαž›αŸ” αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž–αžΈαžšαžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžœαŸαž›αžΆαž’αžŸαŸ‹αž–αŸαž›αŸ” αž‘αžΈαž˜αž½αž™ αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž’αŸ’αžœαžΎαž€αžΆαžš αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž†αŸαŸ‡αž“αŸ…αž•αŸ’αž“αŸ‚αž€αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎ αž“αŸ„αŸ‡αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αž‰αžΎαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αžΉαž„αžαŸ’αžšαž›αž”αŸ‹αž˜αž€αžœαž·αž‰αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž•αž»αžαž€αŸ†αžŽαžαŸ‹αž“αŸ…αž’αŸ’αž“αž€αž‘αž‘αž½αž› αž“αŸ„αŸ‡αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αžΆαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž αž αžΎαž™αžŸαŸ†αžŽαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“αž‘αžΎαž„αžœαž·αž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαŸ”

αž§αž”αž€αžšαžŽαŸαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž‘αžΈαž–αžΈαžšαž‚αžΊαžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž·αž‘αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αžαŸ’αžœαŸ‡αž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαž‚αžΈαž’αŸ’αž“αž€αž•αŸ’αž‰αžΎ αžœαžΆαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž•αž»αžαž€αŸ†αžŽαžαŸ‹ αž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž–αžΈαžαŸ’αž“αžΆαŸ†αž„αž–αžΈαž…αž˜αŸ’αž„αžΆαž™αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž”αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž‘αŸ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ αž αžΎαž™αž’αž“αž’αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αŸαž‰αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αž‘αž‘αž½αž› αž§αž”αž€αžšαžŽαŸαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž”αž·αž‘αž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž€αžΆαžšαž„αžΆαžšαž•αž»αžαž€αŸ†αžŽαžαŸ‹αž–αžΈαžšαžŠαž„αŸ” αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαž”αŸ’αžšαž†αžΆαŸ†αž„αž“αžΉαž„αž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž•αž»αžαž€αŸ†αžŽαžαŸ‹ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž€αŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘ αž αžΎαž™αž’αž“αž’αžΆαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αŸαž‰αŸ”

αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž‰αŸ’αž‡αžΌαž“ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ”

αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž“αŸƒαž–αž·αž’αžΈαž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαžŠαŸ’αž‹αž€αŸ†αžŽαžαŸ‹ αžŠαŸ‚αž›αžšαžŠαŸ’αž‹αž“αžΈαž˜αž½αž™αŸ—αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ”
αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžšαžŠαŸ’αž‹ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ–

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

β€‹αž”αž·αž‘ - αž˜αž·αž“αž˜αŸ‚αž“αž‡αžΆαžšαžŠαŸ’αž‹αž‘αŸ αžœαžΆαž‡αžΆαž…αŸ†αžŽαž»αž…αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž”αž‰αŸ’αž…αž”αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ automaton αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžŠαŸ’αž‹ β€‹αž”αž·αž‘ αž”αŸ’αž›αž»αž€αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž› αžŠαŸ‚αž›αž’αž“αž»αžœαžαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ UDP αž’αžŸαž˜αž€αžΆαž› αž”αž‰αŸ’αž‡αžΌαž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ‚αž›αžŸαž˜αžŸαŸ’αžšαž” αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαžŠαŸ’αž‹αŸ”

αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αž”αžΌαž„ - αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αŸαž‰αž‚αžΊαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡ αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αž”αžΌαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαžšαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αžŸαžΆαžšβ€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž•αŸ’αž‰αžΎβ€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–β€‹αžαŸ‚β€‹αž˜αž½αž™β€‹αž‚αžαŸ‹β€‹αžŠαŸ‚αž›β€‹αžŸαžΆαžšβ€‹αž‘αžΆαŸ†αž„β€‹αž˜αžΌαž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αž‰αžΎαŸ”

αžœαžŠαŸ’αžαž”αž‰αŸ’αž‡αžΌαž“ - αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž€αž‰αŸ’αž…αž”αŸ‹αžŸαžΆαžšαŸ”

αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αŸ…αžœαžΆαž–αžΈαžšαžŠαŸ’αž‹ αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αž”αžΌαž„ αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αž”αžΌαž„αž“αŸƒαžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαŸ” αžœαžΆαžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡ αžŠαŸ‚αž›αžšαžΆαž›αŸ‹αž€αžΆαžšαž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹ αž“αž·αž„αžŸαŸ†αžŽαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαž‘αžΎαž„αžœαž·αž‰αž˜αž€αŸ” αž€αžΆαžšαž…αžΆαž€αž…αŸαž‰αž–αžΈαžœαžΆαž‚αžΊαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž–αžΈαžš - αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαž”αžΆαž“αž‡αŸ„αž‚αž‡αŸαž™αž¬αžŠαŸ„αž™αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž›αŸ”

αž€αž‰αŸ’αž…αž”αŸ‹αž‘αžΈαž˜αž½αž™αž”αžΆαž“αž‘αž‘αž½αž› - αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ†αž”αžΌαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž›αžŸαžΆαžšαŸ”

αžœαžΆαž–αž·αž“αž·αžαŸ’αž™αž—αžΆαž–αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“ αž”αž„αŸ’αž€αžΎαžαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž…αžΆαŸ†αž”αžΆαž…αŸ‹ αž“αž·αž„αž•αŸ’αž‰αžΎαž€αžΆαžšαž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹αž“αŸƒαž€αžΆαžšαž‘αž‘αž½αž›αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ†αž”αžΌαž„αŸ”

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαžšαžŠαŸ‚αž›αž˜αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αžαŸ‚αž˜αž½αž™ αž αžΎαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαžŠαŸ„αž™αž˜αž·αž“αž”αŸ’αžšαžΎαž—αžŸαŸ’αžαž»αžαžΆαž„αž“αŸƒαž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžšαžŠαŸ’αž‹αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαžΆαžšαž”αŸ‚αž”αž“αŸαŸ‡ αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘αŸ”

αžŠαŸ†αž‘αžΎαž„ - αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‘αž‘αž½αž›αž€αž‰αŸ’αž…αž”αŸ‹αžŸαžΆαžšαŸ”

αžœαžΆαžŸαžšαžŸαŸαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž‘αŸ…αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“ αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΆαžšαž”αžΆαžαŸ‹αž”αž„αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αž•αŸ’αž‰αžΎαž€αžΆαžšαž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž€αž‰αŸ’αž…αž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αž“αž·αž„αžŸαžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž› αž“αž·αž„αž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“αž‘αžΎαž„αžœαž·αž‰αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αžΆαžαŸ‹αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŠαŸ‚αž›αž”αžΆαž“αž‘αž‘αž½αž›αž‡αŸ„αž‚αž‡αŸαž™αž“αŸƒαžŸαžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž› αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžšαžŠαŸ’αž‹ αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž”αžΎαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž‘αŸ αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž›αž…αŸαž‰αŸ”

αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹ - αž”αž·αž‘αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž‘αž‘αž½αž›αž”αžΆαž“αžŸαžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž›αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ”

αžšαžŠαŸ’αž‹αž“αŸαŸ‡αž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž‡αž½αž”αž”αŸ’αžšαž‡αž»αŸ†αž‚αŸ’αž“αžΆαž“αŸƒαžŸαžΆαžš αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžšαžŽαžΈαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹αž“αŸ…αžαžΆαž˜αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαŸ” αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž€αž…αŸαž‰αžŠαŸ„αž™αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž› αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž”αžΆαž“αž”αž·αž‘αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™αŸ”

αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αž’αž„αŸ’αž‚αž—αžΆαž–αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“

αž’αžΆαžαž»αžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™αž“αŸƒ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž‚αžΊαž”αŸ’αž›αž»αž€αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αŸ” αž—αžΆαžšαž€αž·αž…αŸ’αž…αž“αŸƒαž”αŸ’αž›αž»αž€αž“αŸαŸ‡αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ αž“αž·αž„αž’αžΆαžαž»αž‡αŸ†αž“αž½αž™ αž…αŸ‚αž€αž…αžΆαž™αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆ αž•αŸ’αžαž›αŸ‹αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž‘αŸ…αž€αžΆαž“αŸ‹αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš API αŸ” αž”αŸ’αž›αž»αž€αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‘αž‘αž½αž›αž”αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž–αžΈαžŸαŸ’αžšαž‘αžΆαž”αŸ‹ UDP αž αžΎαž™αž”αž‰αŸ’αž‡αžΌαž“αžœαžΆαž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαžŠαŸ’αž‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αžœαžΆαž’αž“αž»αžœαžαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ UDP αž’αžŸαž˜αž€αžΆαž›αŸ”
αžŸαž˜αžΆαž‡αž·αž€αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ ReliableUdpConnectionControlBlockαŸ–

internal class ReliableUdpConnectionControlBlock : IDisposable
{
  // массив Π±Π°ΠΉΡ‚ для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для сборки входящих сообщСний    
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> IncomingStreams { get; private set;}
  // массив Π±Π°ΠΉΡ‚ для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ исходящих сообщСний.
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> OutcomingStreams { get; private set; }
  // connection record для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°.
  private readonly ConcurrentDictionary<Tuple<EndPoint, Int32>, ReliableUdpConnectionRecord> m_listOfHandlers;
  // список подписчиков Π½Π° сообщСния.
  private readonly List<ReliableUdpSubscribeObject> m_subscribers;    
  // Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ сокСт    
  private Socket m_socketIn;
  // ΠΏΠΎΡ€Ρ‚ для входящих сообщСний
  private int m_port;
  // Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ IP адрСс
  private IPAddress m_ipAddress;    
  // локальная конСчная Ρ‚ΠΎΡ‡ΠΊΠ°    
  public IPEndPoint LocalEndpoint { get; private set; }    
  // коллСкция ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ…
  // состояний ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°
  public StatesCollection States { get; private set; }
  // Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ случайных чисСл. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания TransmissionId
  private readonly RNGCryptoServiceProvider m_randomCrypto;    	
  //...
}

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ UDP αž’αžŸαž˜αž€αžΆαž›αŸ–

private void Receive()
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  // создаСм Π½ΠΎΠ²Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ socket.BeginReceiveFrom 
  byte[] buffer = new byte[DefaultMaxPacketSize + ReliableUdpHeader.Length];
  // ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° для асинхронного ΠΌΠ΅Ρ‚ΠΎΠ΄Π°
  this.m_socketIn.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref connectedClient, EndReceive, buffer);
}   

private void EndReceive(IAsyncResult ar)
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  int bytesRead = this.m_socketIn.EndReceiveFrom(ar, ref connectedClient);
  //ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½, Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ        
  Receive();
  // Ρ‚.ΠΊ. ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ способ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ вопрос с Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ - ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку Π½Π° Π½Π΅Π³ΠΎ 
  // ΠΈΠ· IAsyncResult.AsyncState        
  byte[] bytes = ((byte[]) ar.AsyncState).Slice(0, bytesRead);
  // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚Π°        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // ΠΏΡ€ΠΈΡˆΠ΅Π» Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ - отбрасываСм Π΅Π³ΠΎ
    return;
  }
  // конструируСм ΠΊΠ»ΡŽΡ‡ для опрСдСлСния connection record’а для ΠΏΠ°ΠΊΠ΅Ρ‚Π°
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ connection record ΠΈΠ»ΠΈ создаСм Π½ΠΎΠ²ΡƒΡŽ
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header.ReliableUdpMessageType));
  // запускаСм ΠΏΠ°ΠΊΠ΅Ρ‚ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚
  record.State.ReceivePacket(record, header, bytes);
}

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž•αŸ’αž‘αŸαžšαžŸαžΆαžšαž“αžΈαž˜αž½αž™αŸ— αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ‚αž›αž˜αžΆαž“αž–αŸαžαŸŒαž˜αžΆαž“αž’αŸ†αž–αžΈαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αŸ” αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αŸ‚αž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹.
αžŸαž˜αžΆαž‡αž·αž€αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ ReliableUdpConnectionRecordαŸ–

internal class ReliableUdpConnectionRecord : IDisposable
{    
  // массив Π±Π°ΠΉΡ‚ с сообщСниСм    
  public byte[] IncomingStream { get; set; }
  // ссылка Π½Π° состояниС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°    
  public ReliableUdpState State { get; set; }    
  // ΠΏΠ°Ρ€Π°, ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ connection record
  // Π² Π±Π»ΠΎΠΊΠ΅ управлСния ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ     
  public Tuple<EndPoint, Int32> Key { get; private set;}
  // ниТняя Π³Ρ€Π°Π½ΠΈΡ†Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°    
  public int WindowLowerBound;
  // Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ
  public readonly int WindowSize;     
  // Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π° для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ
  public int SndNext;
  // количСство ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ
  public int NumberOfPackets;
  // Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ (ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ ΠΈ Π΅ΡΡ‚ΡŒ вторая Ρ‡Π°ΡΡ‚ΡŒ Tuple)
  // для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния свой	
  public readonly Int32 TransmissionId;
  // ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ IP endpoint – собствСнно ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ сообщСния
  public readonly IPEndPoint RemoteClient;
  // Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π½Π° IP ΡƒΡ€ΠΎΠ²Π½Π΅
  // Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ MTU – (IP.Header + UDP.Header + RelaibleUDP.Header)
  public readonly int BufferSize;
  // Π±Π»ΠΎΠΊ управлСния ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ
  public readonly ReliableUdpConnectionControlBlock Tcb;
  // инкапсулируСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для BeginSendMessage/EndSendMessage
  public readonly AsyncResultSendMessage AsyncResult;
  // Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ подтвСрТдСния
  public bool IsNoAnswerNeeded;
  // послСдний ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ (всСгда устанавливаСтся Π² наибольший Π½ΠΎΠΌΠ΅Ρ€)
  public int RcvCurrent;
  // массив с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ потСрянных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
  public int[] LostPackets { get; private set; }
  // ΠΏΡ€ΠΈΡˆΠ΅Π» Π»ΠΈ послСдний ΠΏΠ°ΠΊΠ΅Ρ‚. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ bool.
  public int IsLastPacketReceived = 0;
  //...
}

αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αžšαžŠαŸ’αž‹

αžšαžŠαŸ’αž‹αž’αž“αž»αžœαžαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαžŠαŸ’αž‹αž“αŸƒαž–αž·αž’αžΈαž€αžΆαžš UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“ αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž€αžΎαžαž‘αžΎαž„αŸ” αžαŸ’αž“αžΆαž€αŸ‹αž’αžšαžΌαž”αžΈ ReliableUdpState αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžŠαŸ’αž‹αŸ–

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸƒαž–αž·αž’αžΈαž€αžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžŠαŸ„αž™αžαŸ’αž“αžΆαž€αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž„αž›αžΎ αžšαž½αž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαŸ’αž“αžΆαž€αŸ‹αž‡αŸ†αž“αž½αž™αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž‹αž·αžαž·αžœαž“αŸ’αž αžŠαžΌαž…αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αž”αž„αŸ’αž€αžΎαžαž”αž‹αž˜αž€αžαžΆ ReliableUdp αž–αžΈαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αž“αžΉαž„αž–αž·αž…αžΆαžšαžŽαžΆαž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αžŠαŸ‚αž›αž€αŸ†αžŽαžαŸ‹αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž–αž·αž’αžΈαž€αžΆαžšαŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αž DisposeByTimeout

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš DisposeByTimeout αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž…αŸαž‰αž•αŸ’αžŸαžΆαž™αž’αž“αž’αžΆαž“αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž› αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αžαž›αŸ‹αžŸαž‰αŸ’αž‰αžΆαžαžΆαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžŸαžΆαžšαž‡αŸ„αž‚αž‡αŸαž™/αž˜αž·αž“αž‡αŸ„αž‚αž‡αŸαž™αŸ”
ReliableUdpState.DisposeByTimeoutαŸ–

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

αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžŠαž·αžŸαŸαž’αžαŸ‚αž“αŸ…αž€αŸ’αž“αž»αž„αžšαžŠαŸ’αž‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹.
αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αŸ” DisposeByTimeoutαŸ–

protected override void DisposeByTimeout(object record)
{
  ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;
  // сообщаСм ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния
  SetAsCompleted(connectionRecord);        
}

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš ProcessPackets αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž…αŸ†αž–αŸ„αŸ‡αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž“αŸƒαž€αž‰αŸ’αž…αž”αŸ‹ αž¬αž€αž‰αŸ’αž…αž”αŸ‹αŸ” αž αŸ…αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹ αž¬αžαžΆαž˜αžšαž™αŸˆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αžšαž„αŸ‹αž…αžΆαŸ†αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ”

αž’αžΆαž… αžŠαŸ†αž‘αžΎαž„ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžŠαž·αžŸαŸαž’ αž“αž·αž„αž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαž€αŸ’αž“αž»αž„αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αžΆαžαŸ‹ αž“αž·αž„αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αŸ…αžšαžŠαŸ’αž‹ αž”αžΆαž“αž”αž‰αŸ’αž…αž”αŸ‹αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž‘αž‘αž½αž›αž”αžΆαž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž…αž»αž„αž€αŸ’αžšαŸ„αž™ αž“αž·αž„αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™
αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

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

αž’αžΆαž… αžŠαŸ†αž‘αžΎαž„ αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αž’αžΈαž‘αž‘αž½αž›αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αž€αžΆαžšαž„αžΆαžšαž…αž˜αŸ’αž”αž„αž“αŸƒαž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αžŸαžΆαžšαž–αžΈαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž…αžΌαž›αž€αžΎαžαž‘αžΎαž„αŸ”
αž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†.αž‘αž‘αž½αž›αž€αž‰αŸ’αž…αž”αŸ‹αŸ–

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

αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž™αžΎαž„αž”αžΆαž“αžƒαžΎαž‰αžšαžŠαŸ’αž‹αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“ αž“αž·αž„αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαžŠαŸ‚αž›αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžšαžŠαŸ’αž‹ αžŸαžΌαž˜αž”αŸ†αž”αŸ‚αž€αž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž–αž·αž’αžΈαž€αžΆαžšαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ„αž™αž›αž˜αŸ’αž’αž·αžαž”αž“αŸ’αžαž·αž…αŸ”
αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αžšαŸ„αž˜αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž’αž˜αŸ’αž˜αžαžΆαŸ–αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αž–αž·αž…αžΆαžšαžŽαžΆαž›αž˜αŸ’αž’αž·αžαž’αŸ†αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αžΎαž αž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΆαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αž”αžΌαž„αŸ” αž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‚αžΊαžαŸ‚αž„αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž½αž…αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž αŸ… API αž•αŸ’αž‰αžΎαžŸαžΆαžšαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš StartTransmission αž“αŸƒαž”αŸ’αž›αž»αž€αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ… αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαžΆαžšαžαŸ’αž˜αžΈαŸ”
αž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αŸαž‰αŸ–

private void StartTransmission(ReliableUdpMessage reliableUdpMessage, EndPoint endPoint, AsyncResultSendMessage asyncResult)
{
  if (m_isListenerStarted == 0)
  {
    if (this.LocalEndpoint == null)
    {
      throw new ArgumentNullException( "", "You must use constructor with parameters or start listener before sending message" );
    }
    // запускаСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ входящих ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²
    StartListener(LocalEndpoint);
  }
  // создаСм ΠΊΠ»ΡŽΡ‡ для словаря, Π½Π° основС EndPoint ΠΈ ReliableUdpHeader.TransmissionId        
  byte[] transmissionId = new byte[4];
  // создаСм случайный Π½ΠΎΠΌΠ΅Ρ€ transmissionId        
  m_randomCrypto.GetBytes(transmissionId);
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
  // создаСм Π½ΠΎΠ²ΡƒΡŽ запись для соСдинСния ΠΈ провСряСм, 
  // сущСствуСт Π»ΠΈ ΡƒΠΆΠ΅ Ρ‚Π°ΠΊΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ Π² Π½Π°ΡˆΠΈΡ… словарях
  if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
  {
    // Ссли сущСствуСт – Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ случайный Π½ΠΎΠΌΠ΅Ρ€ 
    m_randomCrypto.GetBytes(transmissionId);
    key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
    if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
      // Ссли снова Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ – Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅
      throw new ArgumentException("Pair TransmissionId & EndPoint is already exists in the dictionary");
  }
  // запустили состояниС Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ         
  m_listOfHandlers[key].State.SendPacket(m_listOfHandlers[key]);
}

αž€αžΆαžšαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ†αž”αžΌαž„ (FirstPacketSending 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);
}

αž€αžΆαžšαž‘αž‘αž½αž›αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ†αž”αžΌαž„ αž“αž·αž„αž•αŸ’αž‰αžΎαž€αžΆαžšαž‘αž‘αž½αž›αžŸαŸ’αž‚αžΆαž›αŸ‹ (αžšαžŠαŸ’αž‹αž‘αž‘αž½αž›αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ†αž”αžΌαž„):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // отбрасываСм ΠΏΠ°ΠΊΠ΅Ρ‚
    return;
  // ...
  // by design всС packet numbers Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с 0;
  if (header.PacketNumber != 0)          
    return;
  // ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ массив для хранСния частСй сообщСния
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  // записываСм Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ Π² массив
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // считаСм ΠΊΠΎΠ»-Π²ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // записываСм Π½ΠΎΠΌΠ΅Ρ€ послСднСго ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // послС сдвинули ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ° Π½Π° 1
  connectionRecord.WindowLowerBound++;
  // ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ состояниС
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;  
  if (/*Ссли Π½Π΅ трСбуСтся ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅*/)
  // ...
  else
  {
    // отправляСм ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αž€αžΆαžšαž”αž·αž‘αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸ…αž–αŸαž›αž’αžŸαŸ‹αž–αŸαž›

αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž›αž‚αžΊαž‡αžΆαž•αŸ’αž“αŸ‚αž€αžŸαŸ†αžαžΆαž“αŸ‹αž“αŸƒ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ” αž–αž·αž…αžΆαžšαžŽαžΆαž§αž‘αžΆαž αžšαžŽαŸαž˜αž½αž™αžŠαŸ‚αž›αžαŸ’αž“αžΆαŸ†αž„αž€αž˜αŸ’αžšαž·αžαž˜αž’αŸ’αž™αž˜αž”αžšαžΆαž‡αŸαž™ αž αžΎαž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αž“αž»αž„αž‘αž·αžŸαžŠαŸ…αž‘αžΆαŸ†αž„αž–αžΈαžšαž˜αž·αž“αž’αžΆαž…αž‘αŸ…αžšαž½αž…αž“αŸ„αŸ‡αž‘αŸαŸ”
αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž·αž‘αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαžΆαž˜αž–αŸαž›αžœαŸαž›αžΆαž€αŸ†αžŽαžαŸ‹αŸ–αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αžŠαžΌαž…αžŠαŸ‚αž›αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αž–αžΈαžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž’αŸ’αžœαžΎαž€αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž˜αž½αž™αŸ” αžœαžΆαž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžœαž·αž’αžΈ SendPacket αž“αŸƒαžšαžŠαŸ’αž‹ αžœαžŠαŸ’αžαž”αž‰αŸ’αž‡αžΌαž“.
αž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž’αŸ’αžœαžΎαž€αžΆαžš (αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αž‰αŸ’αž‡αžΌαž“αžœαžŠαŸ’αž)αŸ–

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

αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαŸ” αž€αžΆαžšαžŸαŸ’αžαžΆαžšαž€αžΆαžšαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™

αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αžŸαŸ’αžαžΆαžšαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž”αžΆαžαŸ‹αž”αž„αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ–αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž–αž·αž’αžΈαž€αžΆαžš Udp αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ .Net

αžŠαžΌαž…αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαžšαž½αž…αž αžΎαž™αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αž·αž‘αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸ…αž–αŸαž›αž’αžŸαŸ‹αž–αŸαž› αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„αž’αŸ’αžœαžΎαž€αžΆαžšαž•αž»αžαž€αŸ†αžŽαžαŸ‹ αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž”αžΆαžαŸ‹αŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž”αžΆαžαŸ‹αž”αž„αŸ‹αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž…αŸ†αž“αž½αž“αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž˜αž·αž“αž”αžΆαž“αž‘αŸ…αžŠαž›αŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αŸ” αž›αŸαžαž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž’αžΆαžšαŸ LostPackets αž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™ αž αžΎαž™αžŸαŸ†αžŽαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΉαž€αž‡αž‰αŸ’αž‡αžΌαž“αž‘αžΎαž„αžœαž·αž‰αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎαŸ”
αž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΌαž“αž€αž‰αŸ’αž…αž”αŸ‹αž‘αžΎαž„αžœαž·αž‰ (αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†)αŸ–

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  //...
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // Π΅ΡΡ‚ΡŒ потСрянныС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, отсылаСм запросы Π½Π° Π½ΠΈΡ…
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // ...
  }
}

αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαž“αžΉαž„αž‘αž‘αž½αž›αž™αž€αžŸαŸ†αžŽαžΎαž…αŸ‚αž€αž…αžΆαž™αž‘αžΎαž„αžœαž·αž‰ αž αžΎαž™αž•αŸ’αž‰αžΎαž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαžαŸ‹αŸ” αžœαžΆαž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαžΆαž“αŸ…αž–αŸαž›αž“αŸαŸ‡αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž–αŸαž›αžœαŸαž›αžΆαž”αž·αž‘αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžšαž½αž…αž αžΎαž™αž αžΎαž™αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ†αžŽαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αžΎαž„αžœαž·αž‰αŸ”
αž”αž‰αŸ’αž‡αžΌαž“αž€αž‰αŸ’αž…αž”αŸ‹αžŠαŸ‚αž›αž”αžΆαžαŸ‹αž”αž„αŸ‹αž‘αžΎαž„αžœαž·αž‰ (αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžœαžŠαŸ’αžαž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  // сброс Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° закрытия соСдинСния 
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // это запрос Π½Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ – отправляСм Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

αž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αžŠαŸ‚αž›αž•αŸ’αž‰αžΎαž‘αžΎαž„αžœαž·αž‰ (αž€αž‰αŸ’αž…αž”αŸ‹αž›αŸαž 3 αž€αŸ’αž“αž»αž„αžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜) αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αžŠαŸ„αž™αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž…αžΌαž›αŸ” αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαž”αž„αŸ’αž’αž½αž…αž‘αž‘αž½αž›αž‚αžΊαž–αŸαž‰αž αžΎαž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αž˜αŸ’αž˜αžαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαŸ’αžŠαžΆαžšαž‘αžΎαž„αžœαž·αž‰αŸ”
αž–αž·αž“αž·αžαŸ’αž™αžšαž€αž˜αžΎαž›αž€αžΆαžšαž…αž»αž…αž“αŸ…αž€αŸ’αž“αž»αž„αž”αž„αŸ’αž’αž½αž…αž‘αž‘αž½αž› (αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  // ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²        
  connectionRecord.PacketCounter++;
  // записываСм Π² массив управлСния ΠΎΠΊΠ½ΠΎΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π°        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // устанавливаСм наибольший ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // пСрСзапускам Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // Ссли Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΈ всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΎΠΊΠ½Π°, Ρ‚ΠΎ сбрасываСм счСтчик
  // ΠΈ высылаСм ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // сбрасываСм счСтчик.      
    connectionRecord.PacketCounter = 0;
    // сдвинули ΠΎΠΊΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ массива управлСния ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // ...
}

UDP API αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž’αŸ’αžœαžΎβ€‹αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜β€‹αž‡αžΆαž˜αž½αž™β€‹αž–αž·αž’αžΈαž€αžΆαžšβ€‹αž•αŸ’αž‘αŸαžšβ€‹αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž˜αžΆαž“β€‹αžαŸ’αž“αžΆαž€αŸ‹ Udp αžŠαŸ‚αž›β€‹αž’αžΆαž…β€‹αž‡αžΏβ€‹αž‘αž»αž€β€‹αž…αž·αžαŸ’αžβ€‹αž”αžΆαž“β€‹αž”αžΎαž€ αžŠαŸ‚αž›β€‹αž‡αžΆβ€‹αž€αžΆαžšβ€‹αžšαž»αŸ†β€‹αž›αžΎβ€‹αž”αŸ’αž›αž»αž€β€‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„β€‹αž€αžΆαžšβ€‹αž•αŸ’αž‘αŸαžšαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŸαž˜αžΆαž‡αž·αž€αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹αŸ–

public sealed class ReliableUdp : IDisposable
{
  // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ
  public IPEndPoint LocalEndpoint    
  // создаСт экзСмпляр ReliableUdp ΠΈ запускаСт
  // ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΠ΅ входящих ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ IP адрСсС
  // ΠΈ ΠΏΠΎΡ€Ρ‚Ρƒ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 для ΠΏΠΎΡ€Ρ‚Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ использованиС
  // динамичСски Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ€Ρ‚Π°
  public ReliableUdp(IPAddress localAddress, int port = 0) 
  // подписка Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ входящих сообщСний
  public ReliableUdpSubscribeObject SubscribeOnMessages(ReliableUdpMessageCallback callback, ReliableUdpMessageTypes messageType = ReliableUdpMessageTypes.Any, IPEndPoint ipEndPoint = null)    
  // отписка ΠΎΡ‚ получСния сообщСний
  public void Unsubscribe(ReliableUdpSubscribeObject subscribeObject)
  // асинхронно ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС 
  // ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с XP ΠΈ Server 2003 Π½Π΅ тСряСтся, Ρ‚.ΠΊ. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ .NET Framework 4.0
  public Task<bool> SendMessageAsync(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, CancellationToken cToken)
  // Π½Π°Ρ‡Π°Ρ‚ΡŒ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сообщСния
  public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)
  // ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ асинхронной ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ
  public bool EndSendMessage(IAsyncResult asyncResult)  
  // ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ рСсурсы
  public void Dispose()    
}

αžŸαžΆαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αžŠαŸ„αž™αž€αžΆαžšαž‡αžΆαžœαŸ” αž αžαŸ’αžαž›αŸαžαžΆαžαŸ†αžŽαžΆαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαž·αž’αžΈαž αŸ…αžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αŸ–

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

αžŸαžΆαžšαŸ–

public class ReliableUdpMessage
{
  // Ρ‚ΠΈΠΏ сообщСния, простоС пСрСчислСниС
  public ReliableUdpMessageTypes Type { get; private set; }
  // Π΄Π°Π½Π½Ρ‹Π΅ сообщСния
  public byte[] Body { get; private set; }
  // Ссли установлСно Π² true – ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ подтвСрТдСния доставки Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½
  // для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ сообщСния
  public bool NoAsk { get; private set; }
}

αžŠαžΎαž˜αŸ’αž”αžΈαž‡αžΆαžœαž”αŸ’αžšαž—αŸαž‘αžŸαžΆαžšαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αž˜αž½αž™ αž“αž·αž„/αž¬αž’αŸ’αž“αž€αž•αŸ’αž‰αžΎαž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹ αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž‡αž˜αŸ’αžšαžΎαžŸαž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαŸ– ReliableUdpMessageTypes messageType αž“αž·αž„ IPEndPoint ipEndPoint αŸ”

αž”αŸ’αžšαž—αŸαž‘αžŸαžΆαžšαŸ–

public enum ReliableUdpMessageTypes : short
{ 
  // Π›ΡŽΠ±ΠΎΠ΅
  Any = 0,
  // Запрос ΠΊ STUN server 
  StunRequest = 1,
  // ΠžΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ STUN server
  StunResponse = 2,
  // ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ„Π°ΠΉΠ»Π°
  FileTransfer =3,
  // ...
}

αžŸαžΆαžšβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž•αŸ’αž‰αžΎβ€‹αžŠαŸ„αž™β€‹αž’αžŸαž˜αž€αžΆαž›β€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž“αŸαŸ‡ αž–αž·αž’αžΈαž€αžΆαžšβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž‚αŸ†αžšαžΌβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž’αžŸαž˜αž€αžΆαž›αŸ–

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

αž›αž‘αŸ’αž’αž•αž›αž“αŸƒαž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαžΆαžšαž“αžΉαž„αž–αž·αž - αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαžΆαžšαž”αžΆαž“αž‘αŸ…αžŠαž›αŸ‹αž’αŸ’αž“αž€αž‘αž‘αž½αž›αžŠαŸ„αž™αž‡αŸ„αž‚αž‡αŸαž™ αž“αž·αž„αž˜αž·αž“αž–αž·αž - αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž·αž‘αžŠαŸ„αž™αž’αžŸαŸ‹αž–αŸαž›αŸ–

public bool EndSendMessage(IAsyncResult asyncResult)

αžŸαŸαž…αž€αŸ’αžαžΈαžŸαž“αŸ’αž“αž·αžŠαŸ’αž‹αžΆαž“

αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž‘αŸαŸ” αž™αž“αŸ’αžαž€αžΆαžšαž•αŸ’αž‚αžΌαž•αŸ’αž‚αž„αžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™ αž€αžΆαžšαž›αžΎαž€αž›αŸ‚αž„ αž“αž·αž„αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αŸ†αž αž»αžŸ αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžšαž•αŸ’αž‰αžΎαžŸαžΆαžšαž’αžŸαž˜αž€αžΆαž›αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŸαŸ’αž“αžΌαž›αž“αŸƒαž–αž·αž’αžΈαž€αžΆαžš αž€αžΆαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžαž€αŸ’αž€αžœαž·αž‡αŸ’αž‡αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αž‰αŸ’αž…αž”αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž€αžΆαžšαž’αžŸαŸ‹αž–αŸαž› αž‚αž½αžšαžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αŸ”

αž€αŸ†αžŽαŸ‚αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž“αŸƒαž–αž·αž’αžΈαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αž‚αžΊαžšαžΉαž„αž˜αžΆαŸ† αž“αž·αž„αž’αžΆαž…αž”αžαŸ‹αž”αŸ‚αž“αž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ†αž–αŸαž‰αžαžΆαž˜αžαž˜αŸ’αžšαžΌαžœαž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž–αžΈαž˜αž»αž“αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αžαžΆαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ‚αž›αž˜αŸ’αž’αŸ” αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž“αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž”αž“αŸ’αž αž“αž·αž„αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž–αŸαž›αžœαŸαž›αžΆαž€αŸ†αžŽαžαŸ‹αžαžΆαž˜αžœαž“αŸ’αž αž™αž“αŸ’αžαž€αžΆαžšαžŠαžΌαž…αž‡αžΆαž”αž„αŸ’αž’αž½αž…αžšαž’αž·αž› αž“αž·αž„ RTT αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž–αž·αž’αžΈαž€αžΆαžš αžœαžΆαž€αŸαž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž•αž„αžŠαŸ‚αžšαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž™αž“αŸ’αžαž€αžΆαžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹ MTU αžšαžœαžΆαž„αžαŸ’αž“αžΆαŸ†αž„αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ (αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžŸαžΆαžšαž’αŸ†αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‰αžΎ) .

αžŸαžΌαž˜αž’αžšαž‚αž»αžŽαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžαŸ’αž‰αž»αŸ†αž‘αž“αŸ’αž‘αžΉαž„αžšαž„αŸ‹αž…αžΆαŸ†αž˜αžαž·αž™αŸ„αž”αž›αŸ‹ αž“αž·αž„αž™αŸ„αž”αž›αŸ‹αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

PS αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž’αŸ’αž“αž€β€‹αžŠαŸ‚αž›β€‹αž…αžΆαž”αŸ‹β€‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸβ€‹αž›αž˜αŸ’αž’αž·αžβ€‹αž¬β€‹αž‚αŸ’αžšαžΆαž“αŸ‹β€‹αžαŸ‚β€‹αž…αž„αŸ‹β€‹αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αž–αž·αž’αžΈαž€αžΆαžšβ€‹, αžαŸ†αžŽβ€‹αž‘αŸ…β€‹αž€αžΆαž“αŸ‹β€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αž“αŸ…β€‹αž›αžΎ GitHube​:
αž‚αž˜αŸ’αžšαŸ„αž„ UDP αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ”

αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹ αž“αž·αž„αž’αžαŸ’αžαž”αž‘αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸ

  1. αž›αž€αŸ’αžαžŽαŸˆαž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαž“αŸƒαž–αž·αž’αžΈαž€αžΆαžš TCPαŸ– αž‡αžΆαž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ ΠΈ αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž”αŸ’αžšαž‘αŸαžŸβ€‹αžšαž»αžŸαŸ’αžŸαŸŠαžΈ
  2. αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž–αž·αž’αžΈαž€αžΆαžš UDPαŸ– αž‡αžΆαž—αžΆαžŸαžΆαž’αž„αŸ‹αž‚αŸ’αž›αŸαžŸ ΠΈ αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž”αŸ’αžšαž‘αŸαžŸβ€‹αžšαž»αžŸαŸ’αžŸαŸŠαžΈ
  3. αž€αžΆαžšαž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž–αž·αž’αžΈαžŸαžΆαžš RUDPαŸ– draft-ietf-sigtran-reliable-udp-00
  4. αž–αž·αž’αžΈαžŸαžΆαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“αŸ– rfc ៑៑្៣ ΠΈ rfc ៑៑្៣
  5. αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαžŸαžΆαž˜αž‰αŸ’αž‰αž“αŸƒαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž›αžΎ UDPαŸ– αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαžšαž»αž”αž“αŸƒαž”αžŽαŸ’αžαžΆαž‰αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‡αžΆαž˜αž½αž™ .NET αž“αž·αž„ UDP
  6. αž’αžαŸ’αžαž”αž‘αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž™αž“αŸ’αžαž€αžΆαžšαž†αŸ’αž›αž„αž€αžΆαžαŸ‹ NATαŸ– αž€αžΆαžšαž”αŸ’αžšαžΆαžŸαŸ’αžšαŸαž™αž‘αžΆαž€αŸ‹αž‘αž„αž–αžΈαž˜αž·αžαŸ’αžαž—αŸαž€αŸ’αžαž·αž†αŸ’αž›αž„αžαžΆαž˜αž”αžŽαŸ’αžαžΆαž‰αž’αŸ’αž“αž€αž”αž€αž”αŸ’αžšαŸ‚αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“
  7. αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αžšαžΌαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžŸαž˜αž€αžΆαž›αŸ– αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αž CLR Asynchronous Programming Model ΠΈ αžšαž”αŸ€αž”αž’αž“αž»αžœαžαŸ’αžαž‚αŸ†αžšαžΌαžšαž…αž“αžΆ IAsyncResult
  8. αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‚αŸ†αžšαžΌαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αžŸαž˜αž€αžΆαž›αž‘αŸ…αž›αŸ†αž“αžΆαŸ†αž’αžŸαž˜αž€αžΆαž›αž•αŸ’αž’αŸ‚αž€αž›αžΎαž—αžΆαžšαž€αž·αž…αŸ’αž… (APM αž€αŸ’αž“αž»αž„ TAP)αŸ–
    αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ TPL αž“αž·αž„αž”αŸ’αžšαž–αŸƒαžŽαžΈ .NET Asynchronous Programming
    αž’αž“αŸ’αžαžšαž€αž˜αŸ’αž˜αž‡αžΆαž˜αž½αž™αž›αŸ†αž“αžΆαŸ† αž“αž·αž„αž”αŸ’αžšαž—αŸαž‘αž’αžŸαž˜αž€αžΆαž›αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αŸ– αžŸαžΌαž˜αž’αžšαž‚αž»αžŽ Mayorovp ΠΈ αžŸαŸŠαžΈαžŠαžšαžΈαžŸαŸ’αž αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž‚αŸ†αž“αž·αžαž“αŸƒαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž—αžΆαžšαž€αž·αž…αŸ’αž…αž‘αŸ…αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αŸ” αž—αžΆαž–αž†αž”αž‚αŸ’αž“αžΆαž“αŸƒαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαž…αžΆαžŸαŸ‹αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ†αž›αŸ„αž—αž‘αŸαž–αŸ’αžšαŸ„αŸ‡ αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαž‘αžΈ 4 αž‚αžΆαŸ†αž‘αŸ’αžšαž‘αžΆαŸ†αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ XP αž“αž·αž„ 2003 αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹