.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸ āĻ…āĻ¨ā§‡āĻ• āĻ†āĻ—ā§‡āĻ‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸā§‡āĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ - UDP āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĄā§‡āĻŸāĻžāĻ—ā§āĻ°āĻžāĻŽ āĻāĻŦāĻ‚ āĻ¸āĻŽā§āĻĒā§āĻ°āĻšāĻžāĻ° āĻ¸āĻ°āĻŦāĻ°āĻžāĻš āĻ•āĻ°āĻ¤ā§‡ āĻ¨āĻ¯āĻŧ, āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ "āĻĒāĻŋāĻ¯āĻŧāĻžāĻ°-āĻŸā§-āĻĒāĻŋāĻ¯āĻŧāĻžāĻ°" āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¨āĻ•āĻļāĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡, āĻāĻ‡ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĻŸāĻŋāĻ° āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻĒā§‚āĻ°ā§āĻŦā§‡ āĻ…āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻŋāĻ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¤āĻŦā§‡, āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ—ā§āĻ˛āĻŋ, āĻ¯ā§‡āĻŽāĻ¨ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋāĻ° āĻ…āĻ­āĻžāĻŦ, āĻ•ā§‹āĻĨāĻžāĻ“ āĻ…āĻĻā§ƒāĻļā§āĻ¯ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧāĻ¨āĻŋāĨ¤ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ UDP āĻāĻ° āĻ‰āĻĒāĻ° āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋāĻ¯ā§āĻ•ā§āĻ¤ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°ā§‡āĨ¤
āĻ¸ā§‚āĻšāĻŋāĻĒāĻ¤ā§āĻ°:āĻĒā§āĻ°āĻŦā§‡āĻļ
āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻž
āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻšā§‡āĻĄāĻžāĻ°
āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¨ā§€āĻ¤āĻŋ
āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻāĻŦāĻ‚ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°
āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ¸ā§āĻŸā§‡āĻŸ āĻĄāĻžāĻ¯āĻŧāĻžāĻ—ā§āĻ°āĻžāĻŽ
āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻ¸āĻ‚āĻ•ā§āĻ°āĻŽāĻŖ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ‡āĻ‰āĻ¨āĻŋāĻŸ
āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻ°āĻžāĻœā§āĻ¯āĻ—ā§āĻ˛āĻŋ

āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¤ā§ˆāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨
āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡
āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡
āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP API
āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°
āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻ˛āĻŋāĻ™ā§āĻ• āĻāĻŦāĻ‚ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§

āĻĒā§āĻ°āĻŦā§‡āĻļ

āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸā§‡āĻ° āĻŽā§‚āĻ˛ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°āĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻœāĻžāĻ¤ā§€āĻ¯āĻŧ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ¸ā§āĻĨāĻžāĻ¨ āĻ§āĻ°ā§‡ āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¨ā§‹āĻĄā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āĻ¯āĻžāĻĒā§€ āĻāĻŦāĻ‚ āĻ…āĻ¨āĻ¨ā§āĻ¯ āĻ†āĻ‡āĻĒāĻŋ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¨ā§‹āĻĄā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻ–āĻ¨ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸā§‡āĻ°, āĻ†āĻ¸āĻ˛ā§‡, āĻāĻ•āĻŸāĻŋ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ - āĻ—ā§āĻ˛ā§‹āĻŦāĻžāĻ˛ āĻ†āĻ‡āĻĒāĻŋ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻāĻ˛āĻžāĻ•āĻž āĻāĻŦāĻ‚ NAT āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸āĻ—ā§āĻ˛āĻŋāĻ° āĻĒāĻŋāĻ›āĻ¨ā§‡ āĻ˛ā§āĻ•āĻžāĻ¨ā§‹ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ¸āĻš āĻ…āĻ¨ā§‡āĻ• āĻāĻ˛āĻžāĻ•āĻžāĨ¤āĻāĻ‡ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°ā§‡, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ—ā§āĻ˛ā§‹āĻŦāĻžāĻ˛ āĻ…ā§āĻ¯āĻžāĻĄā§āĻ°ā§‡āĻ¸ āĻ¸ā§āĻĒā§‡āĻ¸ā§‡ āĻĨāĻžāĻ•āĻž āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸āĻ—ā§āĻ˛āĻŋ āĻ¸āĻšāĻœā§‡āĻ‡ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡ āĻ¯ā§‡ āĻ•āĻžāĻ°āĻ“ āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ•āĻžāĻ°āĻŖ āĻ¤āĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨āĻ¨ā§āĻ¯, āĻŦāĻŋāĻļā§āĻŦāĻŦā§āĻ¯āĻžāĻĒā§€ āĻ°āĻžāĻ‰āĻŸā§‡āĻŦāĻ˛ IP āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻžāĻ‡āĻ­ā§‡āĻŸ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨ā§‹āĻĄ āĻāĻ•āĻ‡ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¨ā§‹āĻĄā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻŦāĻ‚ āĻ—ā§āĻ˛ā§‹āĻŦāĻžāĻ˛ āĻ…ā§āĻ¯āĻžāĻĄā§āĻ°ā§‡āĻ¸ āĻ¸ā§āĻĒā§‡āĻ¸ā§‡āĻ° āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¸ā§āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ¨ā§‹āĻĄā§‡āĻ° āĻ¸āĻžāĻĨā§‡āĻ“ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻ‡ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋ āĻŽā§‚āĻ˛āĻ¤ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻ…āĻ°ā§āĻœāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ NAT āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸, āĻ¯ā§‡āĻŽāĻ¨ Wi-Fi āĻ°āĻžāĻ‰āĻŸāĻžāĻ°, āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻļā§‡āĻˇ āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡ IP āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻāĻŦāĻ‚ āĻĒā§‹āĻ°ā§āĻŸ āĻ¨āĻŽā§āĻŦāĻ°āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ‚āĻļā§‹āĻ§āĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻžāĻ‡āĻ­ā§‡āĻŸ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻĨā§‡āĻ•ā§‡ āĻ—ā§āĻ˛ā§‹āĻŦāĻžāĻ˛ āĻ…ā§āĻ¯āĻžāĻĄā§āĻ°ā§‡āĻ¸ āĻ¸ā§āĻĒā§‡āĻ¸ā§‡ āĻšā§‹āĻ¸ā§āĻŸā§‡ āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ•āĻ‡ āĻ¸āĻŽāĻ¯āĻŧā§‡, NAT āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸āĻ—ā§āĻ˛āĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻŸā§āĻ°ā§āĻ¯āĻžāĻĢāĻŋāĻ• āĻŦā§āĻ˛āĻ• āĻ•āĻ°ā§‡ āĻ¯āĻĻāĻŋ āĻ¨āĻž āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻ˛āĻžāĻĻāĻž āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ¨ā§‡āĻŸā§‡āĻ° āĻāĻ‡ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ-āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻ¸āĻ āĻŋāĻ•, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸāĻ°āĻž āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āĻ¯āĻžāĻĒā§€ āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻŸāĻŋ āĻĻā§āĻŸāĻŋ āĻ¨ā§‹āĻĄā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĨ¤ āĻĒāĻŋāĻ¯āĻŧāĻžāĻ°-āĻŸā§-āĻĒāĻŋāĻ¯āĻŧāĻžāĻ° āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ¯ā§‡āĻŽāĻ¨ āĻ­āĻ¯āĻŧā§‡āĻ¸ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ (āĻ¸ā§āĻ•āĻžāĻ‡āĻĒ), āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻžāĻ°ā§‡ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ (āĻŸāĻŋāĻŽāĻ­āĻŋāĻ‰āĻ¯āĻŧāĻžāĻ°) āĻŦāĻž āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ āĻ—ā§‡āĻŽāĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻā§āĻŸāĻŋ āĻ¨ā§‹āĻĄā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤

āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻĒā§āĻ°āĻžāĻ‡āĻ­ā§‡āĻŸ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡ āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĒāĻŋāĻ¯āĻŧāĻžāĻ°-āĻŸā§-āĻĒāĻŋāĻ¯āĻŧāĻžāĻ° āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛ āĻšā§‹āĻ˛ āĻĒāĻžāĻžā§āĻšāĻŋāĻ‚āĨ¤ āĻāĻ‡ āĻ•ā§ŒāĻļāĻ˛āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻ‡āĻ‰āĻĄāĻŋāĻĒāĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ­āĻžāĻŦā§‡ āĻĄā§‡āĻŸāĻž āĻ¸āĻ°āĻŦāĻ°āĻžāĻšā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŽā§āĻĒāĻŋāĻ‰āĻŸāĻžāĻ°ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĢāĻžāĻ‡āĻ˛ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ UDP āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ…āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻšāĻŦā§‡ āĻ•āĻžāĻ°āĻŖ UDP āĻāĻ•āĻŸāĻŋ āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋāĻ¯ā§āĻ•ā§āĻ¤ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ¨āĻ¯āĻŧ āĻāĻŦāĻ‚ TCP āĻāĻ° āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛

āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋāĻ¯ā§āĻ•ā§āĻ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡, āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ˛ā§‡āĻ¯āĻŧāĻžāĻ° āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ UDP-āĻ¤ā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤

āĻ†āĻŽāĻŋ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ¨ā§‹āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¯ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻĒā§āĻ°āĻžāĻ‡āĻ­ā§‡āĻŸ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡ āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ TCP āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ TCP āĻšā§‹āĻ˛ āĻĒāĻžāĻžā§āĻšāĻŋāĻ‚ āĻ•ā§ŒāĻļāĻ˛ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ…āĻ¨ā§‡āĻ• NAT āĻĄāĻŋāĻ­āĻžāĻ‡āĻ¸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ā§‡āĻ° āĻ…āĻ­āĻžāĻŦā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡, āĻāĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻŦāĻŋāĻŦā§‡āĻšāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻ¯ā§‡āĻŽāĻ¨ āĻ¨ā§‹āĻĄ

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡āĻ° āĻŦāĻžāĻ•āĻŋ āĻ…āĻ‚āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻ‰āĻĒāĻ° āĻĢā§‹āĻ•āĻžāĻ¸ āĻ•āĻ°āĻŦāĨ¤ UDP āĻšā§‹āĻ˛ āĻĒāĻžāĻžā§āĻšāĻŋāĻ‚ āĻ•ā§ŒāĻļāĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤

āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻž

  1. āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻāĻ•āĻŸāĻŋ āĻ‡āĻ¤āĻŋāĻŦāĻžāĻšāĻ• āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻšāĻ¯āĻŧ (āĻ¤āĻĨāĻžāĻ•āĻĨāĻŋāĻ¤ āĻ‡āĻ¤āĻŋāĻŦāĻžāĻšāĻ• āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ)
  2. āĻŦāĻĄāĻŧ āĻĄā§‡āĻŸāĻžāĻ° āĻĻāĻ•ā§āĻˇ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨, āĻ¯ā§‡āĻŽāĻ¨ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĻ•ā§‡ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ…āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ°āĻŋāĻ˛ā§‡ āĻ•āĻ°āĻž āĻāĻĄāĻŧāĻžāĻ¤ā§‡ āĻšāĻŦā§‡
  3. āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻžāĻ¤āĻŋāĻ˛ āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤ (āĻāĻ•āĻŸāĻŋ "āĻŦāĻŋāĻļā§āĻĻā§āĻ§" UDP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž)
  4. āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻ¸āĻš āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŽā§‹āĻĄ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž
  5. āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻĢāĻžāĻ°ā§‡āĻ° āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ‡āĻ‰āĻ¨āĻŋāĻŸ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻšāĻ¤ā§‡ āĻšāĻŦā§‡

āĻāĻ‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻŽā§‚āĻ˛āĻ¤ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻŽāĻŋāĻ˛ā§‡ āĻ¯āĻžāĻ¯āĻŧ āĻ†āĻ°āĻāĻĢāĻ¸āĻŋ 908 и āĻ†āĻ°āĻāĻĢāĻ¸āĻŋ 1151, āĻāĻŦāĻ‚ āĻāĻ‡ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĻŸāĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻŽāĻŋ āĻ¸ā§‡āĻ‡ āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛āĻžāĻŽā§ˇ

āĻāĻ‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻŦā§‹āĻāĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻ¸ā§āĻ¨ TCP āĻāĻŦāĻ‚ UDP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĻā§āĻŸāĻŋ āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ¨ā§‹āĻĄā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°ā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĻā§‡āĻ–āĻŋāĨ¤ āĻ‰āĻ­āĻ¯āĻŧ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤
TCP āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ…-āĻ‡āĻ¨ā§āĻŸāĻžāĻ°ā§‡āĻ•ā§āĻŸāĻŋāĻ­ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°:.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻ†āĻĒāĻ¨āĻŋ āĻĄāĻžāĻ¯āĻŧāĻžāĻ—ā§āĻ°āĻžāĻŽ āĻĨā§‡āĻ•ā§‡ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›ā§‡āĻ¨, āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻšāĻžāĻ°āĻžāĻ¨ā§‹āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, TCP āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻļāĻ¨āĻžāĻ•ā§āĻ¤ āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻ…āĻ‚āĻļā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°ā§‡ āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°āĻŦā§‡āĨ¤
UDP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°:.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

UDP āĻ•ā§‹āĻ¨ā§‹ āĻ•ā§āĻˇāĻ¤āĻŋ āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤āĻ•āĻ°āĻŖ āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ āĻ¨ā§‡āĻ¯āĻŧ āĻ¨āĻžāĨ¤ UDP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ­āĻžāĻŦā§‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡āĻ° āĻĻāĻžāĻ¯āĻŧāĻŋāĻ¤ā§āĻŦāĨ¤

TCP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤āĻ•āĻ°āĻŖ āĻāĻ•āĻŸāĻŋ āĻļā§‡āĻˇ āĻ¨ā§‹āĻĄā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§‡, āĻ¸ā§‡āĻ‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§‡, āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻšā§‡āĻĄāĻžāĻ°ā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻŦāĻžāĻ‡āĻŸā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻ¨āĻŽā§āĻŦāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ…āĻŦāĻšāĻŋāĻ¤ āĻ•āĻ°ā§‡āĨ¤

āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤āĻ­āĻžāĻŦā§‡, āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°āĻ¤ā§‡ (āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻ¨āĻž āĻĒā§‡āĻ¯āĻŧā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ¸ā§‡āĻ—āĻŽā§‡āĻ¨ā§āĻŸ āĻĒāĻžāĻ āĻžāĻ¨), TCP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ¤āĻĨāĻžāĻ•āĻĨāĻŋāĻ¤ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ - āĻ¸ā§‡āĻ—āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻĒā§āĻ°ā§‡āĻ°āĻ• āĻ¯ā§‡ āĻĄā§‡āĻŸāĻž āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻ†āĻļāĻž āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻžāĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻŦāĻžāĻ‡āĻŸāĨ¤

TCP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻ¤āĻĨā§āĻ¯ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻĻā§‡āĻ–ā§āĻ¨ āĻ†āĻ°āĻāĻĢāĻ¸āĻŋ 793, UDP āĻĨā§‡āĻ•ā§‡ āĻ†āĻ°āĻāĻĢāĻ¸āĻŋ 768āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡, āĻ†āĻ¸āĻ˛ā§‡, āĻ¤āĻžāĻ°āĻž āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ.

āĻ‰āĻĒāĻ°ā§‹āĻ•ā§āĻ¤ āĻĨā§‡āĻ•ā§‡, āĻāĻŸāĻž āĻ¸ā§āĻĒāĻˇā§āĻŸ āĻ¯ā§‡ UDP āĻāĻ° āĻ‰āĻĒāĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ (āĻāĻ° āĻĒāĻ°ā§‡ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP), āĻāĻŸāĻŋ āĻŸāĻŋāĻ¸āĻŋāĻĒāĻŋ-āĻāĻ° āĻŽāĻ¤ā§‹ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ¯āĻĨāĻž:

  • āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§āĻ¨
  • āĻ¸ā§‡āĻ—āĻŽā§‡āĻ¨ā§āĻŸ āĻ¨āĻŽā§āĻŦāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨
  • āĻŦāĻŋāĻļā§‡āĻˇ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨
  • āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻĨā§āĻ°ā§āĻĒā§āĻŸ āĻŦāĻžāĻĄāĻŧāĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ°āĻ˛ā§€āĻ•ā§ƒāĻ¤ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨

āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻ†āĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨:

  • āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°āĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻļā§āĻ°ā§āĻ° āĻ¸āĻ‚āĻ•ā§‡āĻ¤
  • āĻ†āĻĒāĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋ āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻ•āĻ°ā§āĻ¨
  • āĻ¸āĻ‚āĻ¯ā§‹āĻ—-āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĻ•ā§‡ "āĻŦāĻŋāĻļā§āĻĻā§āĻ§" UDP āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻāĻŋāĻ¨

āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻšā§‡āĻĄāĻžāĻ°

āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻŦā§‡āĻ¨ āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ UDP āĻĄā§‡āĻŸāĻžāĻ—ā§āĻ°āĻžāĻŽ āĻāĻ•āĻŸāĻŋ āĻ†āĻ‡āĻĒāĻŋ āĻĄā§‡āĻŸāĻžāĻ—ā§āĻ°āĻžāĻŽā§‡ āĻāĻ¨āĻ•ā§āĻ¯āĻžāĻĒāĻ¸ā§āĻ˛ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻāĻ•āĻŸāĻŋ UDP āĻĄā§‡āĻŸāĻžāĻ—ā§āĻ°āĻžāĻŽā§‡ āĻ¯āĻĨāĻžāĻ¯āĻĨāĻ­āĻžāĻŦā§‡ "āĻŽā§‹āĻĄāĻŧāĻžāĻ¨ā§‹" āĻšāĻ¯āĻŧāĨ¤
āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻšā§‡āĻĄāĻžāĻ° āĻāĻ¨āĻ•ā§āĻ¯āĻžāĻĒāĻ¸ā§āĻ˛ā§‡āĻļāĻ¨:.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻšā§‡āĻĄāĻžāĻ°ā§‡āĻ° āĻ—āĻ āĻ¨ āĻŦā§‡āĻļ āĻ¸āĻšāĻœ:

.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

  • āĻĒāĻ¤āĻžāĻ•āĻž - āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻĒāĻ¤āĻžāĻ•āĻž
  • MessageType - āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸āĻžāĻŦāĻ¸ā§āĻ•ā§āĻ°āĻžāĻ‡āĻŦ āĻ•āĻ°āĻ¤ā§‡ āĻ†āĻĒāĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻ•āĻžāĻ°
  • āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨āĻ†āĻ‡āĻĄāĻŋ - āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž, āĻĒā§āĻ°āĻžāĻĒāĻ•ā§‡āĻ° āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻāĻŦāĻ‚ āĻĒā§‹āĻ°ā§āĻŸ āĻ¸āĻš, āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋāĻ•ā§‡ āĻ…āĻ¨āĻ¨ā§āĻ¯āĻ­āĻžāĻŦā§‡ āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤ āĻ•āĻ°ā§‡
  • PacketNumber - āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ¨āĻŽā§āĻŦāĻ°
  • āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ - āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĨ¤ āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻāĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ†āĻ•āĻžāĻ° āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧ

āĻĒāĻ¤āĻžāĻ•āĻžāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒ:

  • FirstPacket - āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ
  • NoAsk - āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋāĻ° āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡
  • LastPacket - āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻļā§‡āĻˇ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ
  • RequestForPacket - āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻŦāĻž āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§

āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¨ā§€āĻ¤āĻŋ

āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻĻā§āĻŸāĻŋ āĻ¨ā§‹āĻĄā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°ā§‡āĻ°āĻŖā§‡āĻ° āĻ‰āĻĒāĻ° āĻĻā§ƒāĻˇā§āĻŸāĻŋ āĻ¨āĻŋāĻŦāĻĻā§āĻ§ āĻ•āĻ°ā§‡, āĻ¤āĻžāĻ‡ āĻāĻŸāĻŋ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ…āĻ¨ā§āĻ¯ āĻĻāĻŋāĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻŦā§‡āĨ¤ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ¤ā§‡, āĻĒā§āĻ°ā§‡āĻ°āĻ• āĻĢāĻžāĻ°ā§āĻ¸ā§āĻŸāĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻ¤āĻžāĻ•āĻž āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¨, āĻ¯āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻ…āĻ°ā§āĻĨ āĻšāĻŦā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻˇā§āĻ āĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ, āĻŦāĻž, āĻ…āĻ¨ā§āĻ¯ āĻ•āĻĨāĻžāĻ¯āĻŧ, āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ, āĻ¸āĻ°ā§āĻŦāĻĻāĻž PacketNumber āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ° āĻŽāĻžāĻ¨ āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻŦā§ƒāĻšāĻ¤ā§āĻ¤āĻŽ PacketNumber āĻŽāĻžāĻ¨ā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋāĻ¤ā§‡ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§‡āĨ¤ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻŸāĻŋ āĻšāĻ˛ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ†āĻ•āĻžāĻ°āĨ¤

āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ LastPacket āĻĒāĻ¤āĻžāĻ•āĻž āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻļā§‡āĻˇ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻ†āĻ›ā§‡āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡, āĻļā§‡āĻˇ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž + 1 āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¯āĻžāĻ° āĻ…āĻ°ā§āĻĨ āĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻĒāĻ•ā§āĻˇā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋāĻ° āĻ¸āĻĢāĻ˛ āĻŦāĻŋāĻ¤āĻ°āĻŖāĨ¤
āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻŦāĻ‚ āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋ āĻšāĻŋāĻ¤ā§āĻ°:.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻ˛ā§‡, āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻŦā§āĻ˛āĻ•ā§‡ āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦā§āĻ˛āĻ•ā§‡, āĻļā§‡āĻˇāĻŸāĻŋ āĻ›āĻžāĻĄāĻŧāĻž, āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻŸāĻŋ āĻ°āĻŋāĻ¸āĻŋāĻ­/āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻŸ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹ āĻ¸āĻžāĻ‡āĻœā§‡āĻ° āĻ¸āĻŽāĻžāĻ¨āĨ¤ āĻĄā§‡āĻŸāĻžāĻ° āĻļā§‡āĻˇ āĻŦā§āĻ˛āĻ•ā§‡ āĻ•āĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻĒāĻ°ā§‡, āĻĒā§āĻ°ā§‡āĻ°āĻŖāĻ•āĻžāĻ°ā§€ āĻĒāĻ•ā§āĻˇ āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻŦāĻž āĻšāĻžāĻ°āĻžāĻ¨ā§‹ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡, āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ°āĻŋāĻ¸āĻŋāĻ­/āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻŸ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻŸāĻŋ āĻ–ā§‹āĻ˛āĻž āĻ°ā§‡āĻ–ā§‡āĨ¤ āĻŦā§āĻ˛āĻ• āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋāĻ° āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻ°, āĻ°āĻŋāĻ¸āĻŋāĻ­/āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻŸ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹ āĻļāĻŋāĻĢāĻŸ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻŦā§āĻ˛āĻ• āĻĄā§‡āĻŸāĻž āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤

āĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻĒāĻ•ā§āĻˇ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°ā§‡āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĒāĻĄāĻŧā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻāĻŦāĻ‚ āĻĄā§āĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻŸ āĻ¯āĻž āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻ¤ā§‡ āĻĒāĻĄāĻŧā§‡ āĻ¨āĻž āĻ¤āĻž āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ•āĻžāĻ°āĻŖ āĻ¯āĻĻāĻŋ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻ° āĻ†āĻ•āĻžāĻ° āĻ¸ā§āĻĨāĻŋāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻžāĻĒāĻ• āĻāĻŦāĻ‚ āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻ‡ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻ•ā§āĻˇāĻ¤āĻŋ āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻŸāĻŋ āĻĄāĻžāĻŸāĻž āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°āĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻšāĻ¯āĻŧ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻ¯āĻĻāĻŋ āĻ•āĻžāĻœā§‡āĻ° āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŋāĻ¤ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻŸāĻŋ āĻĒā§‚āĻ°āĻŖ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻšā§‡āĻ• āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¯ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻŦā§‡āĨ¤
āĻ°āĻŋāĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻĄāĻžāĻ¯āĻŧāĻžāĻ—ā§āĻ°āĻžāĻŽ:.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻāĻŦāĻ‚ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°

āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¨āĻž āĻ•ā§‡āĻ¨ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ•āĻžāĻ°āĻŖ āĻ†āĻ›ā§‡āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¯āĻĻāĻŋ āĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻĒāĻ•ā§āĻˇ āĻ…āĻĢāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻĨāĻžāĻ•ā§‡āĨ¤ āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻž āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§āĻŸāĻŋ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤ āĻĒā§āĻ°āĻĨāĻŽāĻŸāĻŋ, āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°, āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻšā§‹āĻ¸ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻĒāĻ•ā§āĻˇ āĻĨā§‡āĻ•ā§‡ āĻĢāĻžāĻ¯āĻŧāĻžāĻ° āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻļā§‡āĻˇ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻŸāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻĻāĻŋ āĻĒā§āĻ°āĻžāĻĒāĻ•ā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°ā§‡āĻ° āĻŽā§‡āĻ¯āĻŧāĻžāĻĻ āĻļā§‡āĻˇ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻšā§‡āĻ• āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤

āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ—ā§‡āĻ° āĻ…āĻ­āĻžāĻŦā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤ āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻĒāĻ•ā§āĻˇā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻŸāĻŋ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ°ā§€ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°ā§‡āĻ° āĻŽā§‡āĻ¯āĻŧāĻžāĻĻ āĻļā§‡āĻˇ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡āĻ‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¨ā§‹āĻĄ āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡āĨ¤ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¨āĻž āĻĨāĻžāĻ•āĻ˛ā§‡, āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ›ā§‡āĻĄāĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤ āĻ°āĻŋāĻ¸āĻŋāĻ­āĻŋāĻ‚ āĻ¸āĻžāĻ‡āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻĻā§āĻ‡āĻŦāĻžāĻ° āĻļā§‡āĻˇ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻ° āĻ•āĻžāĻ¨ā§‡āĻ•āĻļāĻ¨ āĻ•ā§āĻ˛ā§‹āĻœ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ•ā§āĻˇāĻ¤āĻŋāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻŦā§€āĻŽāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĨ¤ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°ā§‡āĻ° āĻŽā§‡āĻ¯āĻŧāĻžāĻĻ āĻļā§‡āĻˇ āĻšāĻ¯āĻŧā§‡ āĻ—ā§‡āĻ˛ā§‡, āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋāĻ“ āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ¸ā§āĻŸā§‡āĻŸ āĻĄāĻžāĻ¯āĻŧāĻžāĻ—ā§āĻ°āĻžāĻŽ

āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ¨ā§€āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ¸ā§€āĻŽ āĻ°āĻžāĻˇā§āĻŸā§āĻ° āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¯āĻžāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€āĨ¤
āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻ¸ā§āĻŸā§‡āĻŸ āĻĄāĻžāĻ¯āĻŧāĻžāĻ—ā§āĻ°āĻžāĻŽ:

.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻŦāĻ¨ā§āĻ§ - āĻāĻŸāĻŋ āĻ†āĻ¸āĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻ°āĻžāĻˇā§āĻŸā§āĻ° āĻ¨āĻ¯āĻŧ, āĻāĻŸāĻŋ āĻ…āĻŸā§‹āĻŽā§‡āĻŸāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻļā§āĻ°ā§ āĻāĻŦāĻ‚ āĻļā§‡āĻˇ āĻŦāĻŋāĻ¨ā§āĻĻā§āĨ¤ āĻ°āĻžāĻˇā§āĻŸā§āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻ¨ā§āĻ§ āĻāĻ•āĻŸāĻŋ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛ āĻŦā§āĻ˛āĻ• āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ UDP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°ā§‡, āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¯āĻĨāĻžāĻ¯āĻĨ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡ āĻĢāĻ°ā§‹āĻ¯āĻŧāĻžāĻ°ā§āĻĄ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§‡āĻŸ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻŋāĻ‚ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĨ¤

FirstPacketSending - āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ˛ā§‡ āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻšāĻ¯āĻŧāĨ¤

āĻāĻ‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧ, āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤ āĻĒāĻžāĻ āĻžāĻ¨ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻ›āĻžāĻĄāĻŧāĻž āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻŸāĻŋāĻ‡ āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻ°āĻžāĻˇā§āĻŸā§āĻ° āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤

āĻ¸ā§‡āĻ¨ā§āĻĄāĻŋāĻ‚ āĻ¸āĻžāĻ‡āĻ•ā§‡āĻ˛ - āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒā§āĻ°ā§‡āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻĨāĻ˛ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĨ¤

āĻ°āĻžāĻœā§āĻ¯ āĻĨā§‡āĻ•ā§‡ āĻāĻŸāĻŋāĻ¤ā§‡ āĻ‰āĻ¤ā§āĻ¤āĻ°āĻŖ FirstPacketSending āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻĒāĻ°ā§‡ āĻŦāĻžāĻšāĻŋāĻ¤ āĻšāĻ¯āĻŧ. āĻāĻ‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻƒāĻĒā§āĻ°āĻšāĻžāĻ°ā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ†āĻ¸ā§‡āĨ¤ āĻāĻŸāĻŋ āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻĻā§āĻŸāĻŋ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¸āĻŽā§āĻ­āĻŦ - āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋāĻ° āĻ¸āĻĢāĻ˛ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻŦāĻž āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡āĨ¤

āĻĢāĻžāĻ°ā§āĻ¸ā§āĻŸāĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ°āĻŋāĻ¸āĻŋāĻ­āĻĄ - āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻžāĻĒāĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĨ¤

āĻāĻŸāĻŋ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ā§‡āĻ° āĻļā§āĻ°ā§āĻ° āĻ¸āĻ āĻŋāĻ•āĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡, āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤

āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ—āĻ āĻŋāĻ¤ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻĒā§āĻ°āĻŽāĻžāĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ¨āĻž āĻ•āĻ°ā§‡āĻ‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻāĻŸāĻŋāĻ‡ āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻ°āĻžāĻˇā§āĻŸā§āĻ°āĨ¤ āĻāĻ‡ āĻœāĻžāĻ¤ā§€āĻ¯āĻŧ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡, āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧāĨ¤

āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤āĻ•āĻ°āĻ¨ā§‡āĻ° - āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ—ā§āĻ°āĻšāĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĨ¤

āĻāĻŸāĻŋ āĻ…āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§€ āĻ¸āĻžā§āĻšāĻ¯āĻŧāĻ¸ā§āĻĨāĻžāĻ¨ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻ˛āĻŋāĻ–ā§‡, āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ•ā§āĻˇāĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻšā§‡āĻ• āĻ•āĻ°ā§‡, āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻāĻŦāĻ‚ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻĒāĻžāĻ āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻ°āĻžāĻœā§āĻ¯ā§‡ āĻšāĻ˛ā§‡ āĻ¯āĻžāĻ¯āĻŧ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšā§Ÿā§‡āĻ›ā§‡, āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ, āĻāĻ•āĻŸāĻŋ āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤

āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšā§Ÿā§‡āĻ›ā§‡ - āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻžāĨ¤

āĻāĻ‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ¸āĻŽāĻžāĻŦā§‡āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¯āĻ–āĻ¨ āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻĒāĻĨā§‡ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋāĻ° āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖ āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ—ā§‡āĻ›ā§‡āĨ¤ āĻāĻ‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻāĻ•āĻŸāĻŋ āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻŦāĻ¨ā§āĻ§ āĻŦāĻ˛ā§‡ āĻŽāĻ¨ā§‡ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ.

āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻ¸āĻ‚āĻ•ā§āĻ°āĻŽāĻŖ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ‡āĻ‰āĻ¨āĻŋāĻŸ

āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP-āĻāĻ° āĻŽā§‚āĻ˛ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛ āĻŦā§āĻ˛āĻ•āĨ¤ āĻāĻ‡ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻ•āĻžāĻœ āĻšāĻ˛ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻāĻŦāĻ‚ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž, āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ†āĻ—āĻ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻž, āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ API āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻžāĨ¤ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛ āĻŦā§āĻ˛āĻ• UDP āĻ¸ā§āĻ¤āĻ° āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻŸā§‡āĻŸ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒā§‡āĻ¤ā§‡, āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ UDP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§‡āĨ¤
ReliableUdpConnectionControlBlock āĻ•ā§āĻ˛āĻžāĻ¸ā§‡āĻ° āĻ•āĻŋāĻ›ā§ āĻ¸āĻĻāĻ¸ā§āĻ¯:

internal class ReliableUdpConnectionControlBlock : IDisposable
{
  // ĐŧĐ°ŅŅĐ¸Đ˛ йаКŅ‚ Đ´ĐģŅ ŅƒĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐģŅŽŅ‡Đ°. ИŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ ŅĐąĐžŅ€Đēи вŅ…ОдŅŅ‰Đ¸Ņ… ŅĐžĐžĐąŅ‰ĐĩĐŊиК    
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> IncomingStreams { get; private set;}
  // ĐŧĐ°ŅŅĐ¸Đ˛ йаКŅ‚ Đ´ĐģŅ ŅƒĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐģŅŽŅ‡Đ°. ИŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи иŅŅ…ОдŅŅ‰Đ¸Ņ… ŅĐžĐžĐąŅ‰ĐĩĐŊиК.
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> OutcomingStreams { get; private set; }
  // connection record Đ´ĐģŅ ŅƒĐēаСаĐŊĐŊĐžĐŗĐž ĐēĐģŅŽŅ‡Đ°.
  private readonly ConcurrentDictionary<Tuple<EndPoint, Int32>, ReliableUdpConnectionRecord> m_listOfHandlers;
  // ŅĐŋиŅĐžĐē ĐŋОдĐŋиŅŅ‡Đ¸ĐēОв ĐŊĐ° ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ.
  private readonly List<ReliableUdpSubscribeObject> m_subscribers;    
  // ĐģĐžĐēĐ°ĐģŅŒĐŊŅ‹Đš ŅĐžĐēĐĩŅ‚    
  private Socket m_socketIn;
  // ĐŋĐžŅ€Ņ‚ Đ´ĐģŅ вŅ…ОдŅŅ‰Đ¸Ņ… ŅĐžĐžĐąŅ‰ĐĩĐŊиК
  private int m_port;
  // ĐģĐžĐēĐ°ĐģŅŒĐŊŅ‹Đš IP Đ°Đ´Ņ€ĐĩŅ
  private IPAddress m_ipAddress;    
  // ĐģĐžĐēĐ°ĐģŅŒĐŊĐ°Ņ ĐēĐžĐŊĐĩŅ‡ĐŊĐ°Ņ Ņ‚ĐžŅ‡ĐēĐ°    
  public IPEndPoint LocalEndpoint { get; private set; }    
  // ĐēĐžĐģĐģĐĩĐēŅ†Đ¸Ņ ĐŋŅ€ĐĩдваŅ€Đ¸Ņ‚ĐĩĐģŅŒĐŊĐž иĐŊиŅ†Đ¸Đ°ĐģиСиŅ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Ņ…
  // ŅĐžŅŅ‚ĐžŅĐŊиК ĐēĐžĐŊĐĩŅ‡ĐŊĐžĐŗĐž авŅ‚ĐžĐŧĐ°Ņ‚Đ°
  public StatesCollection States { get; private set; }
  // ĐŗĐĩĐŊĐĩŅ€Đ°Ņ‚ĐžŅ€ ŅĐģŅƒŅ‡Đ°ĐšĐŊŅ‹Ņ… Ņ‡Đ¸ŅĐĩĐģ. ИŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ Đ´ĐģŅ ŅĐžĐˇĐ´Đ°ĐŊиŅ TransmissionId
  private readonly RNGCryptoServiceProvider m_randomCrypto;    	
  //...
}

āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻ‡āĻ‰āĻĄāĻŋāĻĒāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨:

private void Receive()
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  // ŅĐžĐˇĐ´Đ°ĐĩĐŧ ĐŊОвŅ‹Đš ĐąŅƒŅ„ĐĩŅ€, Đ´ĐģŅ ĐēĐ°ĐļĐ´ĐžĐŗĐž socket.BeginReceiveFrom 
  byte[] buffer = new byte[DefaultMaxPacketSize + ReliableUdpHeader.Length];
  // ĐŋĐĩŅ€ĐĩĐ´Đ°ĐĩĐŧ ĐąŅƒŅ„ĐĩŅ€ в ĐēĐ°Ņ‡ĐĩŅŅ‚вĐĩ ĐŋĐ°Ņ€Đ°ĐŧĐĩŅ‚Ņ€Đ° Đ´ĐģŅ Đ°ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐŊĐžĐŗĐž ĐŧĐĩŅ‚Ода
  this.m_socketIn.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref connectedClient, EndReceive, buffer);
}   

private void EndReceive(IAsyncResult ar)
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  int bytesRead = this.m_socketIn.EndReceiveFrom(ar, ref connectedClient);
  //ĐŋĐ°ĐēĐĩŅ‚ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊ, ĐŗĐžŅ‚ОвŅ‹ ĐŋŅ€Đ¸ĐŊиĐŧĐ°Ņ‚ŅŒ ŅĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đš        
  Receive();
  // Ņ‚.Đē. ĐŋŅ€ĐžŅŅ‚ĐĩĐšŅˆĐ¸Đš ŅĐŋĐžŅĐžĐą Ņ€ĐĩŅˆĐ¸Ņ‚ŅŒ вОĐŋŅ€ĐžŅ Ņ ĐąŅƒŅ„ĐĩŅ€ĐžĐŧ - ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ŅŅŅ‹ĐģĐēŅƒ ĐŊĐ° ĐŊĐĩĐŗĐž 
  // иС IAsyncResult.AsyncState        
  byte[] bytes = ((byte[]) ar.AsyncState).Slice(0, bytesRead);
  // ĐŋĐžĐģŅƒŅ‡Đ°ĐĩĐŧ СаĐŗĐžĐģОвОĐē ĐŋĐ°ĐēĐĩŅ‚Đ°        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // ĐŋŅ€Đ¸ŅˆĐĩĐģ ĐŊĐĩĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đš ĐŋĐ°ĐēĐĩŅ‚ - ĐžŅ‚ĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ĐĩĐŗĐž
    return;
  }
  // ĐēĐžĐŊŅŅ‚Ņ€ŅƒĐ¸Ņ€ŅƒĐĩĐŧ ĐēĐģŅŽŅ‡ Đ´ĐģŅ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиŅ connection record’а Đ´ĐģŅ ĐŋĐ°ĐēĐĩŅ‚Đ°
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // ĐŋĐžĐģŅƒŅ‡Đ°ĐĩĐŧ ŅŅƒŅ‰ĐĩŅŅ‚вŅƒŅŽŅ‰ŅƒŅŽ connection record иĐģи ŅĐžĐˇĐ´Đ°ĐĩĐŧ ĐŊОвŅƒŅŽ
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header.ReliableUdpMessageType));
  // СаĐŋŅƒŅĐēĐ°ĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚ в ОйŅ€Đ°ĐąĐžŅ‚ĐēŅƒ в ĐēĐžĐŊĐĩŅ‡ĐŊŅ‹Đš авŅ‚ĐžĐŧĐ°Ņ‚
  record.State.ReceivePacket(record, header, bytes);
}

āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¯āĻžāĻ¤ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¤āĻĨā§āĻ¯ āĻĨāĻžāĻ•ā§‡āĨ¤ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ—āĻ āĻ¨ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ°ā§‡āĻ•āĻ°ā§āĻĄ.
ReliableUdpConnectionRecord āĻ•ā§āĻ˛āĻžāĻ¸ā§‡āĻ° āĻ•āĻŋāĻ›ā§ āĻ¸āĻĻāĻ¸ā§āĻ¯:

internal class ReliableUdpConnectionRecord : IDisposable
{    
  // ĐŧĐ°ŅŅĐ¸Đ˛ йаКŅ‚ Ņ ŅĐžĐžĐąŅ‰ĐĩĐŊиĐĩĐŧ    
  public byte[] IncomingStream { get; set; }
  // ŅŅŅ‹ĐģĐēĐ° ĐŊĐ° ŅĐžŅŅ‚ĐžŅĐŊиĐĩ ĐēĐžĐŊĐĩŅ‡ĐŊĐžĐŗĐž авŅ‚ĐžĐŧĐ°Ņ‚Đ°    
  public ReliableUdpState State { get; set; }    
  // ĐŋĐ°Ņ€Đ°, ОдĐŊОСĐŊĐ°Ņ‡ĐŊĐž ĐžĐŋŅ€ĐĩĐ´ĐĩĐģŅŅŽŅ‰Đ°Ņ connection record
  // в ĐąĐģĐžĐēĐĩ ŅƒĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡ĐĩĐš     
  public Tuple<EndPoint, Int32> Key { get; private set;}
  // ĐŊиĐļĐŊŅŅ ĐŗŅ€Đ°ĐŊиŅ†Đ° ĐŋŅ€Đ¸ĐĩĐŧĐŊĐžĐŗĐž ĐžĐēĐŊĐ°    
  public int WindowLowerBound;
  // Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐžĐēĐŊĐ° ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸
  public readonly int WindowSize;     
  // ĐŊĐžĐŧĐĩŅ€ ĐŋĐ°ĐēĐĩŅ‚Đ° Đ´ĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи
  public int SndNext;
  // ĐēĐžĐģиŅ‡ĐĩŅŅ‚вО ĐŋĐ°ĐēĐĩŅ‚Ов Đ´ĐģŅ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи
  public int NumberOfPackets;
  // ĐŊĐžĐŧĐĩŅ€ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸ (иĐŧĐĩĐŊĐŊĐž ĐžĐŊ и ĐĩŅŅ‚ŅŒ вŅ‚ĐžŅ€Đ°Ņ Ņ‡Đ°ŅŅ‚ŅŒ Tuple)
  // Đ´ĐģŅ ĐēĐ°ĐļĐ´ĐžĐŗĐž ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ ŅĐ˛ĐžĐš	
  public readonly Int32 TransmissionId;
  // ŅƒĐ´Đ°ĐģĐĩĐŊĐŊŅ‹Đš IP endpoint – ŅĐžĐąŅŅ‚вĐĩĐŊĐŊĐž ĐŋĐžĐģŅƒŅ‡Đ°Ņ‚ĐĩĐģŅŒ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ
  public readonly IPEndPoint RemoteClient;
  // Ņ€Đ°ĐˇĐŧĐĩŅ€ ĐŋĐ°ĐēĐĩŅ‚Đ°, вО иСйĐĩĐļĐ°ĐŊиĐĩ Ņ„Ņ€Đ°ĐŗĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ ĐŊĐ° IP ŅƒŅ€ĐžĐ˛ĐŊĐĩ
  // ĐŊĐĩ Đ´ĐžĐģĐļĐĩĐŊ ĐŋŅ€ĐĩвŅ‹ŅˆĐ°Ņ‚ŅŒ MTU – (IP.Header + UDP.Header + RelaibleUDP.Header)
  public readonly int BufferSize;
  // ĐąĐģĐžĐē ŅƒĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡ĐĩĐš
  public readonly ReliableUdpConnectionControlBlock Tcb;
  // иĐŊĐēĐ°ĐŋŅŅƒĐģиŅ€ŅƒĐĩŅ‚ Ņ€ĐĩСŅƒĐģŅŒŅ‚Đ°Ņ‚Ņ‹ Đ°ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐŊОК ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Đ¸ Đ´ĐģŅ BeginSendMessage/EndSendMessage
  public readonly AsyncResultSendMessage AsyncResult;
  // ĐŊĐĩ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅŅ‚ŅŒ ĐŋĐ°ĐēĐĩŅ‚Ņ‹ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиŅ
  public bool IsNoAnswerNeeded;
  // ĐŋĐžŅĐģĐĩĐ´ĐŊиК ĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊĐž ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊŅ‹Đš ĐŋĐ°ĐēĐĩŅ‚ (вŅĐĩĐŗĐ´Đ° ŅƒŅŅ‚Đ°ĐŊавĐģиваĐĩŅ‚ŅŅ в ĐŊаийОĐģŅŒŅˆĐ¸Đš ĐŊĐžĐŧĐĩŅ€)
  public int RcvCurrent;
  // ĐŧĐ°ŅŅĐ¸Đ˛ Ņ ĐŊĐžĐŧĐĩŅ€Đ°Đŧи ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊŅ‹Ņ… ĐŋĐ°ĐēĐĩŅ‚Ов
  public int[] LostPackets { get; private set; }
  // ĐŋŅ€Đ¸ŅˆĐĩĐģ Đģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ĐŋĐ°ĐēĐĩŅ‚. ИŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ ĐēĐ°Đē bool.
  public int IsLastPacketReceived = 0;
  //...
}

āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻ°āĻžāĻœā§āĻ¯āĻ—ā§āĻ˛āĻŋ

āĻ°āĻžāĻˇā§āĻŸā§āĻ°āĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ āĻ‡āĻ‰āĻĄāĻŋāĻĒāĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ°āĻžāĻˇā§āĻŸā§āĻ°ā§€āĻ¯āĻŧ āĻŽā§‡āĻļāĻŋāĻ¨ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§‡, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻšāĻ¯āĻŧāĨ¤ āĻŦāĻŋāĻŽā§‚āĻ°ā§āĻ¤ āĻŦāĻ°ā§āĻ— ReliableUdpState āĻ°āĻžāĻˇā§āĻŸā§āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡:

.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻŸāĻŋ āĻ‰āĻĒāĻ°ā§‡ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻ•ā§āĻ˛āĻžāĻ¸ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻāĻ•āĻ¤ā§āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ•ā§āĻ¸āĻŋāĻ˛āĻŋāĻ¯āĻŧāĻžāĻ°āĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ āĻ¯āĻž āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡, āĻ¯ā§‡āĻŽāĻ¨, āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻĨā§‡āĻ•ā§‡ ReliableUdp āĻšā§‡āĻĄāĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĨ¤

āĻāĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°ā§‡ āĻāĻŽāĻ¨ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤āĻ­āĻžāĻŦā§‡ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°āĻŦāĨ¤

DisposeByTimeout āĻĒāĻĻā§āĻ§āĻ¤āĻŋ

DisposeByTimeout āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸā§‡āĻ° āĻĒāĻ°ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻĒā§āĻ°āĻ•āĻžāĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻ¸āĻĢāĻ˛/āĻ…āĻ¸āĻĢāĻ˛ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻ¸āĻ‚āĻ•ā§‡āĻ¤ āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€āĨ¤
ReliableUdpState.DisposeByTimeout:

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

āĻāĻŸāĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ°āĻžāĻœā§āĻ¯ā§‡ āĻ“āĻ­āĻžāĻ°āĻ°āĻžāĻ‡āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšā§Ÿā§‡āĻ›ā§‡.
āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĨ¤DisposeByTimeout:

protected override void DisposeByTimeout(object record)
{
  ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;
  // ŅĐžĐžĐąŅ‰Đ°ĐĩĐŧ Ой ŅƒŅĐŋĐĩŅˆĐŊĐžĐŧ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊии ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ
  SetAsCompleted(connectionRecord);        
}

āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ

ProcessPackets āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻŦāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻ—ā§āĻ˛āĻŋāĻ° āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€āĨ¤ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻŦāĻž āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻŸāĻžāĻ‡āĻŽāĻžāĻ°ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•āĻ˛ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ¸āĻ•ā§āĻˇāĻŽ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤āĻ•āĻ°āĻ¨ā§‡āĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻ“āĻ­āĻžāĻ°āĻ°āĻžāĻ‡āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻšāĻžāĻ°āĻžāĻ¨ā§‹ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻšā§‡āĻ• āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻ°āĻžāĻœā§āĻ¯ā§‡ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšā§Ÿā§‡āĻ›ā§‡, āĻļā§‡āĻˇ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¸āĻĢāĻ˛ āĻšā§‡āĻ• āĻĒāĻžāĻ¸ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡
āĻ…ā§āĻ¯āĻžāĻ¸ā§‡āĻŽā§āĻŦāĻ˛āĻŋāĻ‚āĨ¤āĻĒā§āĻ°āĻ¸ā§‡āĻ¸ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.IsDone != 0)
    return;
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // ĐĩŅŅ‚ŅŒ ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊŅ‹Đĩ ĐŋĐ°ĐēĐĩŅ‚Ņ‹, ĐžŅ‚ŅŅ‹ĐģĐ°ĐĩĐŧ СаĐŋŅ€ĐžŅŅ‹ ĐŊĐ° ĐŊиŅ…
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // ŅƒŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ вО вŅ‚ĐžŅ€ĐžĐš Ņ€Đ°Đˇ, Đ´ĐģŅ ĐŋОвŅ‚ĐžŅ€ĐŊОК ĐŋĐžĐŋŅ‹Ņ‚Đēи ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸
    if (!connectionRecord.TimerSecondTry)
    {
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // ĐĩŅĐģи ĐŋĐžŅĐģĐĩ двŅƒŅ… ĐŋĐžĐŋŅ‹Ņ‚ĐžĐē ŅŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐŊиК WaitForPacketTimer 
    // ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐŋĐ°ĐēĐĩŅ‚Ņ‹ - СаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ СавĐĩŅ€ŅˆĐĩĐŊиŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ
    StartCloseWaitTimer(connectionRecord);
  }
  else if (connectionRecord.IsLastPacketReceived != 0)
  // ŅƒŅĐŋĐĩŅˆĐŊĐ°Ņ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐ° 
  {
    // вŅ‹ŅŅ‹ĐģĐ°ĐĩĐŧ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ Đž ĐŋĐžĐģŅƒŅ‡ĐĩĐŊии ĐąĐģĐžĐēĐ° Đ´Đ°ĐŊĐŊŅ‹Ņ…
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.State = connectionRecord.Tcb.States.Completed;
    connectionRecord.State.ProcessPackets(connectionRecord);
    // вĐŧĐĩŅŅ‚Đž ĐŧĐžĐŧĐĩĐŊŅ‚Đ°ĐģŅŒĐŊОК Ņ€ĐĩĐ°ĐģиСаŅ†Đ¸Đ¸ Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛
    // СаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€, ĐŊĐ° ŅĐģŅƒŅ‡Đ°Đš, ĐĩŅĐģи
    // ĐĩŅĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ack ĐŊĐĩ дОКдĐĩŅ‚ Đ´Đž ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģŅ и ĐžĐŊ СаĐŋŅ€ĐžŅĐ¸Ņ‚ ĐĩĐŗĐž ŅĐŊОва.
    // ĐŋĐž ŅŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐŊиŅŽ Ņ‚Đ°ĐšĐŧĐĩŅ€Đ° - Ņ€ĐĩĐ°ĐģиСŅƒĐĩĐŧ Ņ€ĐĩŅŅƒŅ€ŅŅ‹
    // в ŅĐžŅŅ‚ĐžŅĐŊии Completed ĐŧĐĩŅ‚Од Ņ‚Đ°ĐšĐŧĐĩŅ€Đ° ĐŋĐĩŅ€ĐĩĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊ
    StartCloseWaitTimer(connectionRecord);
  }
  // ŅŅ‚Đž ŅĐģŅƒŅ‡Đ°Đš, ĐēĐžĐŗĐ´Đ° ack ĐŊĐ° ĐąĐģĐžĐē ĐŋĐ°ĐēĐĩŅ‚Ов ĐąŅ‹Đģ ĐŋĐžŅ‚ĐĩŅ€ŅĐŊ
  else
  {
    if (!connectionRecord.TimerSecondTry)
    {
      ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // СаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ СавĐĩŅ€ŅˆĐĩĐŊиŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ
    StartCloseWaitTimer(connectionRecord);
  }
}

āĻ¸āĻ•ā§āĻˇāĻŽ āĻ¸ā§‡āĻ¨ā§āĻĄāĻŋāĻ‚ āĻ¸āĻžāĻ‡āĻ•ā§‡āĻ˛ āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻŸāĻŋ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°ā§‡ āĻ•āĻ˛ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻāĻŦāĻ‚ āĻļā§‡āĻˇ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€āĨ¤
SendingCycle.ProcessPackets:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.IsDone != 0)
    return;        
  // ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐŋОвŅ‚ĐžŅ€ĐŊĐž ĐŋĐžŅĐģĐĩĐ´ĐŊиК ĐŋĐ°ĐēĐĩŅ‚ 
  // ( в ŅĐģŅƒŅ‡Đ°Đĩ вОŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ ŅƒĐˇĐĩĐģ-ĐŋŅ€Đ¸ĐĩĐŧĐŊиĐē СаĐŊОвО ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ СаĐŋŅ€ĐžŅŅ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´Đž ĐŊĐĩĐŗĐž ĐŊĐĩ Đ´ĐžŅˆĐģи)        
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, connectionRecord.SndNext - 1));
  // вĐēĐģŅŽŅ‡Đ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ CloseWait – Đ´ĐģŅ ĐžĐļидаĐŊиŅ вОŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ иĐģи ĐĩĐŗĐž СавĐĩŅ€ŅˆĐĩĐŊиŅ
  StartCloseWaitTimer(connectionRecord);
}

āĻ¸āĻ•ā§āĻˇāĻŽ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšā§Ÿā§‡āĻ›ā§‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻšāĻ˛āĻŽāĻžāĻ¨ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ—ā§āĻ°āĻžāĻšāĻ•āĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤
āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.WaitForPacketsTimer != null)
    connectionRecord.WaitForPacketsTimer.Dispose();
  // ŅĐžĐąĐ¸Ņ€Đ°ĐĩĐŧ ŅĐžĐžĐąŅ‰ĐĩĐŊиĐĩ и ĐŋĐĩŅ€ĐĩĐ´Đ°ĐĩĐŧ ĐĩĐŗĐž ĐŋОдĐŋиŅŅ‡Đ¸ĐēĐ°Đŧ
  ReliableUdpStateTools.CreateMessageFromMemoryStream(connectionRecord);
}

āĻ°āĻŋāĻ¸āĻŋāĻ­ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ

āĻ¸āĻ•ā§āĻˇāĻŽ āĻĢāĻžāĻ°ā§āĻ¸ā§āĻŸāĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ°āĻŋāĻ¸āĻŋāĻ­āĻĄ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ•āĻžāĻœ āĻšāĻ˛ āĻĒā§āĻ°āĻĨāĻŽ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻŸāĻŋ āĻ†āĻ¸āĻ˛ā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ā§‡ āĻāĻ¸ā§‡āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ¸āĻŽāĻ¨ā§āĻŦāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻ•āĻ°āĻžāĨ¤
FirstPacketReceived.ReceivePacket:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // ĐžŅ‚ĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚
    return;
  // ĐēĐžĐŧйиĐŊĐ°Ņ†Đ¸Ņ двŅƒŅ… Ņ„ĐģĐ°ĐŗОв - FirstPacket и LastPacket - ĐŗОвОŅ€Đ¸Ņ‚ Ņ‡Ņ‚Đž Ņƒ ĐŊĐ°Ņ ĐĩдиĐŊŅŅ‚вĐĩĐŊĐŊĐžĐĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиĐĩ
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) &
      header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    ReliableUdpStateTools.CreateMessageFromSinglePacket(connectionRecord, header, payload.Slice(ReliableUdpHeader.Length, payload.Length));
    if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
    {
      // ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ          
      ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    }
    SetAsCompleted(connectionRecord);
    return;
  }
  // by design вŅĐĩ packet numbers ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŅ Ņ 0;
  if (header.PacketNumber != 0)          
    return;
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ŅŅ‡Đ¸Ņ‚Đ°ĐĩĐŧ ĐēĐžĐģ-вО ĐŋĐ°ĐēĐĩŅ‚Ов, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐžĐģĐļĐŊŅ‹ ĐŋŅ€Đ¸ĐšŅ‚и
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // СаĐŋиŅŅ‹Đ˛Đ°ĐĩĐŧ ĐŊĐžĐŧĐĩŅ€ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊĐžĐŗĐž ĐŋĐ°ĐēĐĩŅ‚Đ° (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // ĐŋĐžŅĐģĐĩ ŅĐ´Đ˛Đ¸ĐŊŅƒĐģи ĐžĐēĐŊĐž ĐŋŅ€Đ¸ĐĩĐŧĐ° ĐŊĐ° 1
  connectionRecord.WindowLowerBound++;
  // ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ°ĐĩĐŧ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;
  // ĐĩŅĐģи ĐŊĐĩ Ņ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŧĐĩŅ…Đ°ĐŊиСĐŧ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ
  // СаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ ĐēĐžŅ‚ĐžŅ€Ņ‹Đš вŅ‹ŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚ вŅĐĩ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Ņ‹         
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
  {
    connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
  else
  {
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

āĻ¸āĻ•ā§āĻˇāĻŽ āĻ¸ā§‡āĻ¨ā§āĻĄāĻŋāĻ‚ āĻ¸āĻžāĻ‡āĻ•ā§‡āĻ˛ āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋāĻ° āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻĒā§āĻ°ā§‡āĻ°āĻŖā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻ—ā§āĻ˛āĻŋ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ“āĻ­āĻžāĻ°āĻ°āĻžāĻ‡āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤
SendingCycle.ReceivePacket:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (connectionRecord.IsDone != 0)
    return;
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.RequestForPacket))
    return;
  // Ņ€Đ°ŅŅ‡ĐĩŅ‚ ĐēĐžĐŊĐĩŅ‡ĐŊОК ĐŗŅ€Đ°ĐŊиŅ†Ņ‹ ĐžĐēĐŊĐ°
  // ĐąĐĩŅ€ĐĩŅ‚ŅŅ ĐŗŅ€Đ°ĐŊиŅ†Đ° ĐžĐēĐŊĐ° + 1, Đ´ĐģŅ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊиŅ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиК Đ´ĐžŅŅ‚авĐēи
  int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize), (connectionRecord.NumberOfPackets));
  // ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐ° ĐŊĐ° ĐŋĐžĐŋĐ°Đ´Đ°ĐŊиĐĩ в ĐžĐēĐŊĐž        
  if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > windowHighestBound)
    return;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ĐŋŅ€ĐžĐ˛ĐĩŅ€Đ¸Ņ‚ŅŒ ĐŊĐ° ĐŋĐžŅĐģĐĩĐ´ĐŊиК ĐŋĐ°ĐēĐĩŅ‚:
  if (header.PacketNumber == connectionRecord.NumberOfPackets)
  {
    // ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ° СавĐĩŅ€ŅˆĐĩĐŊĐ°
    Interlocked.Increment(ref connectionRecord.IsDone);
    SetAsCompleted(connectionRecord);
    return;
  }
  // ŅŅ‚Đž ĐžŅ‚вĐĩŅ‚ ĐŊĐ° ĐŋĐĩŅ€Đ˛Ņ‹Đš ĐŋĐ°ĐēĐĩŅ‚ c ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩĐŧ         
  if ((header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) && header.PacketNumber == 1))
  {
    // ĐąĐĩС ŅĐ´Đ˛Đ¸ĐŗĐ° ĐžĐēĐŊĐ°
    SendPacket(connectionRecord);
  }
  // ĐŋŅ€Đ¸ŅˆĐģĐž ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ Đž ĐŋĐžĐģŅƒŅ‡ĐĩĐŊии ĐąĐģĐžĐēĐ° Đ´Đ°ĐŊĐŊŅ‹Ņ…
  else if (header.PacketNumber == windowHighestBound)
  {
    // ŅĐ´Đ˛Đ¸ĐŗĐ°ĐĩĐŧ ĐžĐēĐŊĐž ĐŋŅ€Đ¸ĐĩĐŧ/ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ОйĐŊŅƒĐģŅĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛ ĐēĐžĐŊŅ‚Ņ€ĐžĐģŅ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸
    connectionRecord.WindowControlArray.Nullify();
    // ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐąĐģĐžĐē ĐŋĐ°ĐēĐĩŅ‚Ов
    SendPacket(connectionRecord);
  }
  // ŅŅ‚Đž СаĐŋŅ€ĐžŅ ĐŊĐ° ĐŋОвŅ‚ĐžŅ€ĐŊŅƒŅŽ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Ņƒ – ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ Ņ‚Ņ€ĐĩĐąŅƒĐĩĐŧŅ‹Đš ĐŋĐ°ĐēĐĩŅ‚          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

āĻ¸āĻ•ā§āĻˇāĻŽ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤āĻ•āĻ°āĻ¨ā§‡āĻ° āĻ°āĻŋāĻ¸āĻŋāĻ­āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡, āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻžāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ•āĻžāĻœāĻŸāĻŋ āĻ˜āĻŸā§‡āĨ¤
āĻ…ā§āĻ¯āĻžāĻ¸ā§‡āĻŽā§āĻŦāĻ˛āĻŋāĻ‚āĨ¤ āĻ°āĻŋāĻ¸āĻŋāĻ­ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (connectionRecord.IsDone != 0)
    return;
  // ОйŅ€Đ°ĐąĐžŅ‚ĐēĐ° ĐŋĐ°ĐēĐĩŅ‚Ов Ņ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊĐŊŅ‹Đŧ ĐŧĐĩŅ…Đ°ĐŊиСĐŧĐžĐŧ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиŅ Đ´ĐžŅŅ‚авĐēи
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
  {
    // ŅĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€
    connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
    // СаĐŋиŅŅ‹Đ˛Đ°ĐĩĐŧ Đ´Đ°ĐŊĐŊŅ‹Đĩ
    ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
    // ĐĩŅĐģи ĐŋĐžĐģŅƒŅ‡Đ¸Đģи ĐŋĐ°ĐēĐĩŅ‚ Ņ ĐŋĐžŅĐģĐĩĐ´ĐŊиĐŧ Ņ„ĐģĐ°ĐŗĐžĐŧ - Đ´ĐĩĐģĐ°ĐĩĐŧ СавĐĩŅ€ŅˆĐ°ĐĩĐŧ          
    if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
    {
      connectionRecord.State = connectionRecord.Tcb.States.Completed;
      connectionRecord.State.ProcessPackets(connectionRecord);
    }
    return;
  }        
  // Ņ€Đ°ŅŅ‡ĐĩŅ‚ ĐēĐžĐŊĐĩŅ‡ĐŊОК ĐŗŅ€Đ°ĐŊиŅ†Ņ‹ ĐžĐēĐŊĐ°
  int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize - 1), (connectionRecord.NumberOfPackets - 1));
  // ĐžŅ‚ĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ĐŊĐĩ ĐŋĐžĐŋĐ°Đ´Đ°ŅŽŅ‰Đ¸Đĩ в ĐžĐēĐŊĐž ĐŋĐ°ĐēĐĩŅ‚Ņ‹
  if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > (windowHighestBound))
    return;
  // ĐžŅ‚ĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ Đ´ŅƒĐąĐģиĐēĐ°Ņ‚Ņ‹
  if (connectionRecord.WindowControlArray.Contains(header.PacketNumber))
    return;
  // СаĐŋиŅŅ‹Đ˛Đ°ĐĩĐŧ Đ´Đ°ĐŊĐŊŅ‹Đĩ 
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ŅƒĐ˛ĐĩĐģиŅ‡Đ¸Đ˛Đ°ĐĩĐŧ ŅŅ‡ĐĩŅ‚Ņ‡Đ¸Đē ĐŋĐ°ĐēĐĩŅ‚Ов        
  connectionRecord.PacketCounter++;
  // СаĐŋиŅŅ‹Đ˛Đ°ĐĩĐŧ в ĐŧĐ°ŅŅĐ¸Đ˛ ŅƒĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ ĐžĐēĐŊĐžĐŧ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš ĐŊĐžĐŧĐĩŅ€ ĐŋĐ°ĐēĐĩŅ‚Đ°        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // ŅƒŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ ĐŊаийОĐģŅŒŅˆĐ¸Đš ĐŋŅ€Đ¸ŅˆĐĩĐ´ŅˆĐ¸Đš ĐŋĐ°ĐēĐĩŅ‚        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅĐēĐ°Đŧ Ņ‚Đ°ĐšĐŧĐĩŅ€Ņ‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ĐĩŅĐģи ĐŋŅ€Đ¸ŅˆĐĩĐģ ĐŋĐžŅĐģĐĩĐ´ĐŊиК ĐŋĐ°ĐēĐĩŅ‚
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    Interlocked.Increment(ref connectionRecord.IsLastPacketReceived);
  }
  // ĐĩŅĐģи ĐŊĐ°Đŧ ĐŋŅ€Đ¸ŅˆĐģи вŅĐĩ ĐŋĐ°ĐēĐĩŅ‚Ņ‹ ĐžĐēĐŊĐ°, Ņ‚Đž ŅĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ŅŅ‡ĐĩŅ‚Ņ‡Đ¸Đē
  // и вŅ‹ŅŅ‹ĐģĐ°ĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // ŅĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ŅŅ‡ĐĩŅ‚Ņ‡Đ¸Đē.      
    connectionRecord.PacketCounter = 0;
    // ŅĐ´Đ˛Đ¸ĐŊŅƒĐģи ĐžĐēĐŊĐž ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ОйĐŊŅƒĐģĐĩĐŊиĐĩ ĐŧĐ°ŅŅĐ¸Đ˛Đ° ŅƒĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡ĐĩĐš
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // ĐĩŅĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊиК ĐŋĐ°ĐēĐĩŅ‚ ŅƒĐļĐĩ иĐŧĐĩĐĩŅ‚ŅŅ        
  if (Thread.VolatileRead(ref connectionRecord.IsLastPacketReceived) != 0)
  {
    // ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚Ņ‹          
    ProcessPackets(connectionRecord);
  }
}

āĻ¸āĻ•ā§āĻˇāĻŽ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšā§Ÿā§‡āĻ›ā§‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° āĻ•āĻžāĻœ āĻšāĻ˛ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋāĻ° āĻ¸āĻĢāĻ˛ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĨ¤
āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĨ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°ā§āĻ¨:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ĐŋОвŅ‚ĐžŅ€ĐŊĐ°Ņ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐēĐ° ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž ĐŋĐ°ĐēĐĩŅ‚Đ° в ŅĐ˛ŅĐˇĐ¸ Ņ Ņ‚ĐĩĐŧ,
  // Ņ‡Ņ‚Đž ĐŋĐžŅĐģĐĩĐ´ĐŊиК ack ĐŊĐĩ Đ´ĐžŅˆĐĩĐģ Đ´Đž ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ĐĩĐģŅ
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
}

āĻĒāĻžāĻ āĻžāĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ

āĻ¸āĻ•ā§āĻˇāĻŽ FirstPacketSending āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻĄā§‡āĻŸāĻžāĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¯āĻŧ, āĻ…āĻĨāĻŦāĻž, āĻ¯āĻĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋāĻ° āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻĒā§āĻ°ā§‹ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĨ¤
FirstPacketSending.SendPacket:

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
  connectionRecord.PacketCounter = 0;
  connectionRecord.SndNext = 0;
  connectionRecord.WindowLowerBound = 0;       
  // ĐĩŅĐģи ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиŅ ĐŊĐĩ Ņ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ - ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ вŅĐĩ ĐŋĐ°ĐēĐĩŅ‚Ņ‹
  // и вŅ‹ŅĐ˛ĐžĐąĐžĐļĐ´Đ°ĐĩĐŧ Ņ€ĐĩŅŅƒŅ€ŅŅ‹
  if (connectionRecord.IsNoAnswerNeeded)
  {
    // ЗдĐĩŅŅŒ ĐŋŅ€ĐžĐ¸ŅŅ…ОдиŅ‚ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐēĐ° As Is
    do
    {
      ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, ReliableUdpStateTools. CreateReliableUdpHeader(connectionRecord)));
      connectionRecord.SndNext++;
    } while (connectionRecord.SndNext < connectionRecord.NumberOfPackets);
    SetAsCompleted(connectionRecord);
    return;
  }
  // ŅĐžĐˇĐ´Đ°ĐĩĐŧ СаĐŗĐžĐģОвОĐē ĐŋĐ°ĐēĐĩŅ‚Đ° и ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐĩĐŗĐž 
  ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
  // ŅƒĐ˛ĐĩĐģиŅ‡Đ¸Đ˛Đ°ĐĩĐŧ ŅŅ‡ĐĩŅ‚Ņ‡Đ¸Đē
  connectionRecord.SndNext++;
  // ŅĐ´Đ˛Đ¸ĐŗĐ°ĐĩĐŧ ĐžĐēĐŊĐž
  connectionRecord.WindowLowerBound++;
  connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
  // ЗаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€
  connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}

āĻ¸āĻ•ā§āĻˇāĻŽ āĻ¸ā§‡āĻ¨ā§āĻĄāĻŋāĻ‚ āĻ¸āĻžāĻ‡āĻ•ā§‡āĻ˛ āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡, āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤
SendingCycle.SendPacket:

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{      
  // ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐąĐģĐžĐē ĐŋĐ°ĐēĐĩŅ‚Ов      
  for (connectionRecord.PacketCounter = 0;
        connectionRecord.PacketCounter < connectionRecord.WindowSize &&
        connectionRecord.SndNext < connectionRecord.NumberOfPackets;
        connectionRecord.PacketCounter++)
  {
    ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
    connectionRecord.SndNext++;
  }
  // ĐŊĐ° ŅĐģŅƒŅ‡Đ°Đš йОĐģŅŒŅˆĐžĐŗĐž ĐžĐēĐŊĐ° ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸, ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ ĐŋĐžŅĐģĐĩ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи
  connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
  if ( connectionRecord.CloseWaitTimer != null )
  {
    connectionRecord.CloseWaitTimer.Change( -1, -1 );
  }
}

āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¤ā§ˆāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨

āĻāĻ–āĻ¨ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻŦā§‡āĻ¸āĻŋāĻ• āĻ¸ā§āĻŸā§‡āĻŸāĻ¸ āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–ā§‡āĻ›āĻŋ, āĻ†āĻ¸ā§āĻ¨ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛āĻŸāĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ¤āĻžāĻ° āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ†āĻ°āĻ“ āĻŦāĻŋāĻļāĻĻāĻ­āĻžāĻŦā§‡ āĻ­ā§‡āĻ™ā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ•āĨ¤
āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¯āĻŧ āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻĄāĻžāĻ¯āĻŧāĻžāĻ—ā§āĻ°āĻžāĻŽ:.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤āĻ­āĻžāĻŦā§‡ āĻ¸ā§ƒāĻˇā§āĻŸāĻŋ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°ā§āĻ¨ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¤ā§‡āĨ¤ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻ¸ā§‡āĻ‡ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ āĻ¯āĻž āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻŦāĻžāĻ°ā§āĻ¤āĻž API āĻ•āĻ˛ āĻ•āĻ°ā§‡āĨ¤ āĻāĻ°āĻĒāĻ°ā§‡, āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ•āĻ¨ā§āĻŸā§āĻ°ā§‹āĻ˛ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻ¸ā§āĻŸāĻžāĻ°ā§āĻŸ āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻ¨āĻ¤ā§āĻ¨ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĨ¤
āĻāĻ•āĻŸāĻŋ āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡:

private void StartTransmission(ReliableUdpMessage reliableUdpMessage, EndPoint endPoint, AsyncResultSendMessage asyncResult)
{
  if (m_isListenerStarted == 0)
  {
    if (this.LocalEndpoint == null)
    {
      throw new ArgumentNullException( "", "You must use constructor with parameters or start listener before sending message" );
    }
    // СаĐŋŅƒŅĐēĐ°ĐĩĐŧ ОйŅ€Đ°ĐąĐžŅ‚ĐēŅƒ вŅ…ОдŅŅ‰Đ¸Ņ… ĐŋĐ°ĐēĐĩŅ‚Ов
    StartListener(LocalEndpoint);
  }
  // ŅĐžĐˇĐ´Đ°ĐĩĐŧ ĐēĐģŅŽŅ‡ Đ´ĐģŅ ŅĐģОваŅ€Ņ, ĐŊĐ° ĐžŅĐŊОвĐĩ EndPoint и ReliableUdpHeader.TransmissionId        
  byte[] transmissionId = new byte[4];
  // ŅĐžĐˇĐ´Đ°ĐĩĐŧ ŅĐģŅƒŅ‡Đ°ĐšĐŊŅ‹Đš ĐŊĐžĐŧĐĩŅ€ transmissionId        
  m_randomCrypto.GetBytes(transmissionId);
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
  // ŅĐžĐˇĐ´Đ°ĐĩĐŧ ĐŊОвŅƒŅŽ СаĐŋиŅŅŒ Đ´ĐģŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ и ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅĐĩĐŧ, 
  // ŅŅƒŅ‰ĐĩŅŅ‚вŅƒĐĩŅ‚ Đģи ŅƒĐļĐĩ Ņ‚Đ°ĐēОК ĐŊĐžĐŧĐĩŅ€ в ĐŊĐ°ŅˆĐ¸Ņ… ŅĐģОваŅ€ŅŅ…
  if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
  {
    // ĐĩŅĐģи ŅŅƒŅ‰ĐĩŅŅ‚вŅƒĐĩŅ‚ – Ņ‚Đž ĐŋОвŅ‚ĐžŅ€ĐŊĐž ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩĐŧ ŅĐģŅƒŅ‡Đ°ĐšĐŊŅ‹Đš ĐŊĐžĐŧĐĩŅ€ 
    m_randomCrypto.GetBytes(transmissionId);
    key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
    if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
      // ĐĩŅĐģи ŅĐŊОва ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ – ĐŗĐĩĐŊĐĩŅ€Đ¸Ņ€ŅƒĐĩĐŧ иŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ
      throw new ArgumentException("Pair TransmissionId & EndPoint is already exists in the dictionary");
  }
  // СаĐŋŅƒŅŅ‚иĐģи ŅĐžŅŅ‚ĐžŅĐŊиĐĩ в ОйŅ€Đ°ĐąĐžŅ‚ĐēŅƒ         
  m_listOfHandlers[key].State.SendPacket(m_listOfHandlers[key]);
}

āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻšā§āĻ›ā§‡ (FirstPacketSending State):

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
  connectionRecord.PacketCounter = 0;
  connectionRecord.SndNext = 0;
  connectionRecord.WindowLowerBound = 0;       
  // ... 
  // ŅĐžĐˇĐ´Đ°ĐĩĐŧ СаĐŗĐžĐģОвОĐē ĐŋĐ°ĐēĐĩŅ‚Đ° и ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐĩĐŗĐž 
  ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
  // ŅƒĐ˛ĐĩĐģиŅ‡Đ¸Đ˛Đ°ĐĩĐŧ ŅŅ‡ĐĩŅ‚Ņ‡Đ¸Đē
  connectionRecord.SndNext++;
  // ŅĐ´Đ˛Đ¸ĐŗĐ°ĐĩĐŧ ĐžĐēĐŊĐž
  connectionRecord.WindowLowerBound++;
  // ĐŋĐĩŅ€ĐĩŅ…ОдиĐŧ в ŅĐžŅŅ‚ĐžŅĐŊиĐĩ SendingCycle
  connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
  // ЗаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€
  connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}

āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻĒāĻ°ā§‡, āĻĒā§āĻ°ā§‡āĻ°āĻ• āĻ°āĻžāĻœā§āĻ¯ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°ā§‡ āĻ¸ā§‡āĻ¨ā§āĻĄāĻŋāĻ‚ āĻ¸āĻžāĻ‡āĻ•ā§‡āĻ˛ - āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋāĻ° āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨āĨ¤
āĻ—ā§āĻ°āĻšāĻŖāĻ•āĻžāĻ°ā§€ āĻĒāĻ•ā§āĻˇ, EndReceive āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻĒā§āĻ°ā§‡āĻ°āĻŋāĻ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°ā§‡, āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻāĻŦāĻ‚ āĻāĻ‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻŸāĻŋāĻ•ā§‡, āĻāĻ•āĻŸāĻŋ āĻĒā§‚āĻ°ā§āĻŦ-āĻĒāĻžāĻ°ā§āĻ¸āĻĄ āĻšā§‡āĻĄāĻžāĻ° āĻ¸āĻš, āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ°āĻžāĻœā§āĻ¯ā§‡āĻ° āĻ°āĻŋāĻ¸āĻŋāĻ­āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻĒā§āĻ°ā§‡āĻ°āĻŖ āĻ•āĻ°ā§‡ āĻĢāĻžāĻ°ā§āĻ¸ā§āĻŸāĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ°āĻŋāĻ¸āĻŋāĻ­āĻĄ
āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻĻāĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡:

private void EndReceive(IAsyncResult ar)
{
  // ...
  // ĐŋĐ°ĐēĐĩŅ‚ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊ
  // ĐŋĐ°Ņ€ŅĐ¸Đŧ СаĐŗĐžĐģОвОĐē ĐŋĐ°ĐēĐĩŅ‚Đ°        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // ĐŋŅ€Đ¸ŅˆĐĩĐģ ĐŊĐĩĐēĐžŅ€Ņ€ĐĩĐēŅ‚ĐŊŅ‹Đš ĐŋĐ°ĐēĐĩŅ‚ - ĐžŅ‚ĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ĐĩĐŗĐž
    return;
  }
  // ĐēĐžĐŊŅŅ‚Ņ€ŅƒĐ¸Ņ€ŅƒĐĩĐŧ ĐēĐģŅŽŅ‡ Đ´ĐģŅ ĐžĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиŅ connection record’а Đ´ĐģŅ ĐŋĐ°ĐēĐĩŅ‚Đ°
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // ĐŋĐžĐģŅƒŅ‡Đ°ĐĩĐŧ ŅŅƒŅ‰ĐĩŅŅ‚вŅƒŅŽŅ‰ŅƒŅŽ connection record иĐģи ŅĐžĐˇĐ´Đ°ĐĩĐŧ ĐŊОвŅƒŅŽ
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header. ReliableUdpMessageType));
  // СаĐŋŅƒŅĐēĐ°ĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚ в ОйŅ€Đ°ĐąĐžŅ‚ĐēŅƒ в ĐēĐžĐŊĐĩŅ‡ĐŊŅ‹Đš авŅ‚ĐžĐŧĐ°Ņ‚
  record.State.ReceivePacket(record, header, bytes);
}

āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻž āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāĻ¤āĻŋ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ (FirstPacketReceived State):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // ĐžŅ‚ĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚
    return;
  // ...
  // by design вŅĐĩ packet numbers ĐŊĐ°Ņ‡Đ¸ĐŊĐ°ŅŽŅ‚ŅŅ Ņ 0;
  if (header.PacketNumber != 0)          
    return;
  // иĐŊиŅ†Đ¸Đ°ĐģиСиŅ€ŅƒĐĩĐŧ ĐŧĐ°ŅŅĐ¸Đ˛ Đ´ĐģŅ Ņ…Ņ€Đ°ĐŊĐĩĐŊиŅ Ņ‡Đ°ŅŅ‚ĐĩĐš ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  // СаĐŋиŅŅ‹Đ˛Đ°ĐĩĐŧ Đ´Đ°ĐŊĐŊŅ‹Đĩ ĐŋĐ°ĐēĐĩŅ‚ в ĐŧĐ°ŅŅĐ¸Đ˛
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ŅŅ‡Đ¸Ņ‚Đ°ĐĩĐŧ ĐēĐžĐģ-вО ĐŋĐ°ĐēĐĩŅ‚Ов, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐžĐģĐļĐŊŅ‹ ĐŋŅ€Đ¸ĐšŅ‚и
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // СаĐŋиŅŅ‹Đ˛Đ°ĐĩĐŧ ĐŊĐžĐŧĐĩŅ€ ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž ĐŋĐžĐģŅƒŅ‡ĐĩĐŊĐŊĐžĐŗĐž ĐŋĐ°ĐēĐĩŅ‚Đ° (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // ĐŋĐžŅĐģĐĩ ŅĐ´Đ˛Đ¸ĐŊŅƒĐģи ĐžĐēĐŊĐž ĐŋŅ€Đ¸ĐĩĐŧĐ° ĐŊĐ° 1
  connectionRecord.WindowLowerBound++;
  // ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ°ĐĩĐŧ ŅĐžŅŅ‚ĐžŅĐŊиĐĩ
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;  
  if (/*ĐĩŅĐģи ĐŊĐĩ Ņ‚Ņ€ĐĩĐąŅƒĐĩŅ‚ŅŅ ĐŧĐĩŅ…Đ°ĐŊиСĐŧ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ*/)
  // ...
  else
  {
    // ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻŋāĻ‚ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP-āĻāĻ° āĻāĻ•āĻŸāĻŋ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ…āĻ‚āĻļāĨ¤ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°ā§āĻ¨ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻāĻ•āĻŸāĻŋ āĻŽāĻ§ā§āĻ¯āĻŦāĻ°ā§āĻ¤ā§€ āĻ¨ā§‹āĻĄ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ‰āĻ­āĻ¯āĻŧ āĻĻāĻŋāĻ• āĻĨā§‡āĻ•ā§‡ āĻĄā§‡āĻŸāĻž āĻ¸āĻ°āĻŦāĻ°āĻžāĻš āĻ•āĻ°āĻž āĻ…āĻ¸āĻŽā§āĻ­āĻŦ āĻšāĻ¯āĻŧā§‡ āĻ‰āĻ ā§‡āĻ›ā§‡āĨ¤
āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻšāĻŋāĻ¤ā§āĻ°:.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻĄāĻžāĻ¯āĻŧāĻžāĻ—ā§āĻ°āĻžāĻŽ āĻĨā§‡āĻ•ā§‡ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻ¯āĻŧ, āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻ•āĻžāĻœ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡āĻ‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ āĻ°āĻžāĻœā§āĻ¯ā§‡āĻ° āĻ¸ā§‡āĻ¨ā§āĻĄāĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻ˜āĻŸā§‡ āĻ¸ā§‡āĻ¨ā§āĻĄāĻŋāĻ‚ āĻ¸āĻžāĻ‡āĻ•ā§‡āĻ˛.
āĻ•āĻžāĻœā§‡āĻ° āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ (SendingCycle āĻ…āĻŦāĻ¸ā§āĻĨāĻž):

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{      
  // ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐąĐģĐžĐē ĐŋĐ°ĐēĐĩŅ‚Ов   
  // ...   
  // ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ ĐŋĐžŅĐģĐĩ ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи
  connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
  if ( connectionRecord.CloseWaitTimer != null )
    connectionRecord.CloseWaitTimer.Change( -1, -1 );
}

āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¤ā§ˆāĻ°āĻŋ āĻšāĻ˛ā§‡ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ•āĻžāĻ˛ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻļāĻ°ā§āĻŸāĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻĒāĻŋāĻ°āĻŋāĻ¯āĻŧāĻĄ 5 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄāĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡, āĻāĻŸāĻŋ 1,5 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄā§‡ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻāĻ•āĻŸāĻŋ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻļā§‡āĻˇ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ, āĻāĻŸāĻŋ āĻ°āĻžāĻœā§āĻ¯ā§‡āĻ° āĻ°āĻŋāĻ¸āĻŋāĻ­āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻ˜āĻŸā§‡ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤āĻ•āĻ°āĻ¨ā§‡āĻ°
āĻ•āĻžāĻœā§‡āĻ° āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻž (āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻžāĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻž):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ... 
  // ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€Ņ‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
}

āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡ āĻ†āĻ° āĻ•ā§‹āĻ¨ā§‹ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻ†āĻ¸ā§‡āĻ¨āĻŋāĨ¤ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°āĻŸāĻŋ āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ—ā§‡āĻ˛ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ¤ā§‡ āĻ•āĻ˛ āĻ•āĻ°āĻ˛, āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ—ā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻĨāĻŽāĻŦāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤
āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻšā§āĻ›ā§‡ (āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ…āĻŦāĻ¸ā§āĻĨāĻž):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  // ...        
  if (/*ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐ° ĐŊĐ° ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊŅ‹Đĩ ĐŋĐ°ĐēĐĩŅ‚Ņ‹ */)
  {
    // ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ СаĐŋŅ€ĐžŅŅ‹ ĐŊĐ° ĐŋОвŅ‚ĐžŅ€ĐŊŅƒŅŽ Đ´ĐžŅŅ‚авĐēŅƒ
    // ŅƒŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ вО вŅ‚ĐžŅ€ĐžĐš Ņ€Đ°Đˇ, Đ´ĐģŅ ĐŋОвŅ‚ĐžŅ€ĐŊОК ĐŋĐžĐŋŅ‹Ņ‚Đēи ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸
    if (!connectionRecord.TimerSecondTry)
    {
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
    connectionRecord.TimerSecondTry = true;
    return;
    }
  // ĐĩŅĐģи ĐŋĐžŅĐģĐĩ двŅƒŅ… ĐŋĐžĐŋŅ‹Ņ‚ĐžĐē ŅŅ€Đ°ĐąĐ°Ņ‚Ņ‹Đ˛Đ°ĐŊиК WaitForPacketTimer 
  // ĐŊĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ ĐŋĐ°ĐēĐĩŅ‚Ņ‹ - СаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ СавĐĩŅ€ŅˆĐĩĐŊиŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ
  StartCloseWaitTimer(connectionRecord);
  }
  else if (/*ĐŋŅ€Đ¸ŅˆĐĩĐģ ĐŋĐžŅĐģĐĩĐ´ĐŊиК ĐŋĐ°ĐēĐĩŅ‚ и ŅƒŅĐŋĐĩŅˆĐŊĐ°Ņ ĐŋŅ€ĐžĐ˛ĐĩŅ€ĐēĐ° */)
  {
    // ...
    StartCloseWaitTimer(connectionRecord);
  }
  // ĐĩŅĐģи ack ĐŊĐ° ĐąĐģĐžĐē ĐŋĐ°ĐēĐĩŅ‚Ов ĐąŅ‹Đģ ĐŋĐžŅ‚ĐĩŅ€ŅĐŊ
  else
  { 
    if (!connectionRecord.TimerSecondTry)
    {
      // ĐŋОвŅ‚ĐžŅ€ĐŊĐž ĐžŅ‚ŅŅ‹ĐģĐ°ĐĩĐŧ ack
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // СаĐŋŅƒŅĐēĐ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ СавĐĩŅ€ŅˆĐĩĐŊиŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ
    StartCloseWaitTimer(connectionRecord);
  }
}

TimerSecondTry āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻ†āĻ›ā§‡ āĻ¸āĻ¤ā§āĻ¯. āĻāĻ‡ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛āĻŸāĻŋ āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ°āĻŋāĻ¸ā§āĻŸāĻžāĻ°ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§€āĨ¤

āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻĒāĻ•ā§āĻˇ āĻĨā§‡āĻ•ā§‡, āĻ•āĻ°ā§āĻŽāĻ°āĻ¤ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°āĻŸāĻŋāĻ“ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ° āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸āĻ°ā§āĻŦāĻļā§‡āĻˇ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻŸāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤
āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ (SendingCycle āĻ…āĻŦāĻ¸ā§āĻĨāĻž):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  // ...        
  // ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ ĐŋОвŅ‚ĐžŅ€ĐŊĐž ĐŋĐžŅĐģĐĩĐ´ĐŊиК ĐŋĐ°ĐēĐĩŅ‚ 
  // ...        
  // вĐēĐģŅŽŅ‡Đ°ĐĩĐŧ Ņ‚Đ°ĐšĐŧĐĩŅ€ CloseWait – Đ´ĐģŅ ĐžĐļидаĐŊиŅ вОŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊиŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ иĐģи ĐĩĐŗĐž СавĐĩŅ€ŅˆĐĩĐŊиŅ
  StartCloseWaitTimer(connectionRecord);
}

āĻāĻ° āĻĒāĻ°ā§‡, āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤
ReliableUdpState.StartCloseWaitTimer:

protected void StartCloseWaitTimer(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
  else
    connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.LongTimerPeriod, -1);
}

āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻž āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡ 30 āĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄāĨ¤

āĻ…āĻ˛ā§āĻĒ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻĒāĻ°ā§‡, āĻĒā§āĻ°āĻžāĻĒāĻ•ā§‡āĻ° āĻĒāĻžāĻļā§‡āĻ° āĻ•āĻ°ā§āĻŽāĻ°āĻ¤ āĻŸāĻžāĻ‡āĻŽāĻžāĻ°āĻŸāĻŋ āĻ†āĻŦāĻžāĻ° āĻœā§āĻŦāĻ˛ā§‡, āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻ—ā§āĻ˛āĻŋ āĻ†āĻŦāĻžāĻ° āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ†āĻ—āĻ¤ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ

āĻ¯āĻ–āĻ¨ āĻ•ā§āĻ˛ā§‹āĻœ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻĢāĻžāĻ¯āĻŧāĻžāĻ° āĻšāĻ¯āĻŧ, āĻ¤āĻ–āĻ¨ āĻ‰āĻ­āĻ¯āĻŧ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒā§āĻ°ā§‡āĻ°āĻ• āĻ†āĻĒāĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻŦā§āĻ¯āĻ°ā§āĻĨāĻ¤āĻžāĻ° āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°ā§‡ (āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP API āĻĻā§‡āĻ–ā§āĻ¨).
āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¸āĻŽā§āĻĒāĻĻ āĻŽā§āĻ•ā§āĻ¤āĻŋ:

public void Dispose()
{
  try
  {
    System.Threading.Monitor.Enter(this.LockerReceive);
  }
  finally
  {
    Interlocked.Increment(ref this.IsDone);
    if (WaitForPacketsTimer != null)
    {
      WaitForPacketsTimer.Dispose();
    }
    if (CloseWaitTimer != null)
    {
      CloseWaitTimer.Dispose();
    }
    byte[] stream;
    Tcb.IncomingStreams.TryRemove(Key, out stream);
    stream = null;
    Tcb.OutcomingStreams.TryRemove(Key, out stream);
    stream = null;
    System.Threading.Monitor.Exit(this.LockerReceive);
  }
}

āĻ•ā§‹āĻĄā§‡āĻ° āĻ†āĻ°āĻ“ āĻ—āĻ­ā§€āĻ°ā§‡āĨ¤ āĻĄā§‡āĻŸāĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻšāĻžāĻ°āĻžāĻ¨ā§‹āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻ°āĻŋāĻ•āĻ­āĻžāĻ°āĻŋ āĻĄāĻžāĻ¯āĻŧāĻžāĻ—ā§āĻ°āĻžāĻŽ:.Net āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨

āĻŸāĻžāĻ‡āĻŽāĻ†āĻ‰āĻŸā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻ•āĻ°āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¯āĻ–āĻ¨ āĻ•āĻžāĻœā§‡āĻ° āĻŸāĻžāĻ‡āĻŽāĻžāĻ°ā§‡āĻ° āĻŽā§‡āĻ¯āĻŧāĻžāĻĻ āĻļā§‡āĻˇ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ, āĻ¤āĻ–āĻ¨ āĻ°āĻŋāĻ¸āĻŋāĻ­āĻžāĻ° āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦā§‡āĨ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻšāĻžāĻ°āĻžāĻ¨ā§‹āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻĒā§āĻ°āĻžāĻĒāĻ•ā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻĒā§ŒāĻāĻ›āĻžāĻ¯āĻŧāĻ¨āĻŋ āĻāĻŽāĻ¨ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ¸āĻ‚āĻ•āĻ˛āĻ¨ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤ āĻāĻ‡ āĻ¨āĻŽā§āĻŦāĻ°āĻ—ā§āĻ˛āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸āĻ‚āĻ¯ā§‹āĻ—ā§‡āĻ° LostPackets āĻ…ā§āĻ¯āĻžāĻ°ā§‡āĻ¤ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļ āĻ•āĻ°āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧāĨ¤
āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻšā§āĻ›ā§‡ (āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ…āĻŦāĻ¸ā§āĻĨāĻž):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  //...
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // ĐĩŅŅ‚ŅŒ ĐŋĐžŅ‚ĐĩŅ€ŅĐŊĐŊŅ‹Đĩ ĐŋĐ°ĐēĐĩŅ‚Ņ‹, ĐžŅ‚ŅŅ‹ĐģĐ°ĐĩĐŧ СаĐŋŅ€ĐžŅŅ‹ ĐŊĐ° ĐŊиŅ…
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // ...
  }
}

āĻĒā§āĻ°ā§‡āĻ°āĻ• āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸāĻ—ā§āĻ˛āĻŋ āĻĒāĻžāĻ āĻžāĻŦā§‡āĨ¤ āĻāĻŸāĻŋ āĻ˛āĻ•ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ¯ā§‡ āĻāĻ‡ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§‡ āĻĒā§āĻ°ā§‡āĻ°āĻ• āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻ¨ā§āĻ§ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ¯āĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻšāĻ¯āĻŧ, āĻāĻŸāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻšā§āĻ›ā§‡ (SendingCycle āĻ…āĻŦāĻ¸ā§āĻĨāĻž):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  // ŅĐąŅ€ĐžŅ Ņ‚Đ°ĐšĐŧĐĩŅ€Đ° СаĐēŅ€Ņ‹Ņ‚иŅ ŅĐžĐĩдиĐŊĐĩĐŊиŅ 
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // ŅŅ‚Đž СаĐŋŅ€ĐžŅ ĐŊĐ° ĐŋОвŅ‚ĐžŅ€ĐŊŅƒŅŽ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Ņƒ – ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐģŅĐĩĐŧ Ņ‚Ņ€ĐĩĐąŅƒĐĩĐŧŅ‹Đš ĐŋĐ°ĐēĐĩŅ‚          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

āĻ°āĻŋāĻ¸ā§‡āĻ¨ā§āĻŸ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ (āĻšāĻŋāĻ¤ā§āĻ°ā§‡ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ #3) āĻ†āĻ—āĻ¤ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻĻā§āĻŦāĻžāĻ°āĻž āĻ—ā§ƒāĻšā§€āĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ°āĻŋāĻ¸āĻŋāĻ­ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻŸāĻŋ āĻĒā§‚āĻ°ā§āĻŖ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ•āĻŋāĻ¨āĻž āĻ¤āĻž āĻĻā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻšā§‡āĻ• āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻ°āĻŋāĻ¸āĻŋāĻ­ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹āĻ¤ā§‡ āĻšāĻŋāĻŸ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡ (āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°āĻžāĻ° āĻ…āĻŦāĻ¸ā§āĻĨāĻž):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  // ŅƒĐ˛ĐĩĐģиŅ‡Đ¸Đ˛Đ°ĐĩĐŧ ŅŅ‡ĐĩŅ‚Ņ‡Đ¸Đē ĐŋĐ°ĐēĐĩŅ‚Ов        
  connectionRecord.PacketCounter++;
  // СаĐŋиŅŅ‹Đ˛Đ°ĐĩĐŧ в ĐŧĐ°ŅŅĐ¸Đ˛ ŅƒĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ ĐžĐēĐŊĐžĐŧ Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš ĐŊĐžĐŧĐĩŅ€ ĐŋĐ°ĐēĐĩŅ‚Đ°        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // ŅƒŅŅ‚Đ°ĐŊавĐģиваĐĩĐŧ ĐŊаийОĐģŅŒŅˆĐ¸Đš ĐŋŅ€Đ¸ŅˆĐĩĐ´ŅˆĐ¸Đš ĐŋĐ°ĐēĐĩŅ‚        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // ĐŋĐĩŅ€ĐĩСаĐŋŅƒŅĐēĐ°Đŧ Ņ‚Đ°ĐšĐŧĐĩŅ€Ņ‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // ĐĩŅĐģи ĐŊĐ°Đŧ ĐŋŅ€Đ¸ŅˆĐģи вŅĐĩ ĐŋĐ°ĐēĐĩŅ‚Ņ‹ ĐžĐēĐŊĐ°, Ņ‚Đž ŅĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ŅŅ‡ĐĩŅ‚Ņ‡Đ¸Đē
  // и вŅ‹ŅŅ‹ĐģĐ°ĐĩĐŧ ĐŋĐ°ĐēĐĩŅ‚ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиĐĩ
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // ŅĐąŅ€Đ°ŅŅ‹Đ˛Đ°ĐĩĐŧ ŅŅ‡ĐĩŅ‚Ņ‡Đ¸Đē.      
    connectionRecord.PacketCounter = 0;
    // ŅĐ´Đ˛Đ¸ĐŊŅƒĐģи ĐžĐēĐŊĐž ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ОйĐŊŅƒĐģĐĩĐŊиĐĩ ĐŧĐ°ŅŅĐ¸Đ˛Đ° ŅƒĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиŅ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡ĐĩĐš
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // ...
}

āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP API

āĻĄā§‡āĻŸāĻž āĻŸā§āĻ°āĻžāĻ¨ā§āĻ¸āĻĢāĻžāĻ° āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ…ā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻāĻ•āĻŸāĻŋ āĻ–ā§‹āĻ˛āĻž āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ Udp āĻ•ā§āĻ˛āĻžāĻ¸ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¯āĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻ‰āĻĒāĻ° āĻāĻ•āĻŸāĻŋ āĻŽā§‹āĻĄāĻŧāĻ•āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸ā§‡āĻ° āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ¸āĻĻāĻ¸ā§āĻ¯ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡:

public sealed class ReliableUdp : IDisposable
{
  // ĐŋĐžĐģŅƒŅ‡Đ°ĐĩŅ‚ ĐģĐžĐēĐ°ĐģŅŒĐŊŅƒŅŽ ĐēĐžĐŊĐĩŅ‡ĐŊŅƒŅŽ Ņ‚ĐžŅ‡ĐēŅƒ
  public IPEndPoint LocalEndpoint    
  // ŅĐžĐˇĐ´Đ°ĐĩŅ‚ ŅĐēСĐĩĐŧĐŋĐģŅŅ€ ReliableUdp и СаĐŋŅƒŅĐēĐ°ĐĩŅ‚
  // ĐŋŅ€ĐžŅĐģŅƒŅˆĐ¸Đ˛Đ°ĐŊиĐĩ вŅ…ОдŅŅ‰Đ¸Ņ… ĐŋĐ°ĐēĐĩŅ‚Ов ĐŊĐ° ŅƒĐēаСаĐŊĐŊĐžĐŧ IP Đ°Đ´Ņ€ĐĩŅĐĩ
  // и ĐŋĐžŅ€Ņ‚Ņƒ. ЗĐŊĐ°Ņ‡ĐĩĐŊиĐĩ 0 Đ´ĐģŅ ĐŋĐžŅ€Ņ‚Đ° ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚ иŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊиĐĩ
  // диĐŊĐ°ĐŧиŅ‡ĐĩŅĐēи вŅ‹Đ´ĐĩĐģĐĩĐŊĐŊĐžĐŗĐž ĐŋĐžŅ€Ņ‚Đ°
  public ReliableUdp(IPAddress localAddress, int port = 0) 
  // ĐŋОдĐŋиŅĐēĐ° ĐŊĐ° ĐŋĐžĐģŅƒŅ‡ĐĩĐŊиĐĩ вŅ…ОдŅŅ‰Đ¸Ņ… ŅĐžĐžĐąŅ‰ĐĩĐŊиК
  public ReliableUdpSubscribeObject SubscribeOnMessages(ReliableUdpMessageCallback callback, ReliableUdpMessageTypes messageType = ReliableUdpMessageTypes.Any, IPEndPoint ipEndPoint = null)    
  // ĐžŅ‚ĐŋиŅĐēĐ° ĐžŅ‚ ĐŋĐžĐģŅƒŅ‡ĐĩĐŊиŅ ŅĐžĐžĐąŅ‰ĐĩĐŊиК
  public void Unsubscribe(ReliableUdpSubscribeObject subscribeObject)
  // Đ°ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐŊĐž ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ ŅĐžĐžĐąŅ‰ĐĩĐŊиĐĩ 
  // ПŅ€Đ¸ĐŧĐĩŅ‡Đ°ĐŊиĐĩ: ŅĐžĐ˛ĐŧĐĩŅŅ‚иĐŧĐžŅŅ‚ŅŒ Ņ XP и Server 2003 ĐŊĐĩ Ņ‚ĐĩŅ€ŅĐĩŅ‚ŅŅ, Ņ‚.Đē. иŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚ŅŅ .NET Framework 4.0
  public Task<bool> SendMessageAsync(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, CancellationToken cToken)
  // ĐŊĐ°Ņ‡Đ°Ņ‚ŅŒ Đ°ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐŊŅƒŅŽ ĐžŅ‚ĐŋŅ€Đ°Đ˛ĐēŅƒ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ
  public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)
  // ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ Ņ€ĐĩСŅƒĐģŅŒŅ‚Đ°Ņ‚ Đ°ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐŊОК ĐžŅ‚ĐŋŅ€Đ°Đ˛Đēи
  public bool EndSendMessage(IAsyncResult asyncResult)  
  // ĐžŅ‡Đ¸ŅŅ‚иŅ‚ŅŒ Ņ€ĐĩŅŅƒŅ€ŅŅ‹
  public void Dispose()    
}

āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸āĻžāĻŦāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ—ā§ƒāĻšā§€āĻ¤ āĻšāĻ¯āĻŧ. āĻ•āĻ˛āĻŦā§āĻ¯āĻžāĻ• āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¤āĻŋāĻ¨āĻŋāĻ§āĻŋ āĻ¸ā§āĻŦāĻžāĻ•ā§āĻˇāĻ°:

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

ХООйŅ‰ĐĩĐŊиĐĩ:

public class ReliableUdpMessage
{
  // Ņ‚иĐŋ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ, ĐŋŅ€ĐžŅŅ‚ĐžĐĩ ĐŋĐĩŅ€ĐĩŅ‡Đ¸ŅĐģĐĩĐŊиĐĩ
  public ReliableUdpMessageTypes Type { get; private set; }
  // Đ´Đ°ĐŊĐŊŅ‹Đĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ
  public byte[] Body { get; private set; }
  // ĐĩŅĐģи ŅƒŅŅ‚Đ°ĐŊОвĐģĐĩĐŊĐž в true – ĐŧĐĩŅ…Đ°ĐŊиСĐŧ ĐŋОдŅ‚вĐĩŅ€ĐļĐ´ĐĩĐŊиŅ Đ´ĐžŅŅ‚авĐēи ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊ
  // Đ´ĐģŅ ĐŋĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ¸ ĐēĐžĐŊĐēŅ€ĐĩŅ‚ĐŊĐžĐŗĐž ŅĐžĐžĐąŅ‰ĐĩĐŊиŅ
  public bool NoAsk { get; private set; }
}

āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻ° āĻ§āĻ°āĻ¨ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĒā§āĻ°ā§‡āĻ°āĻ•ā§‡āĻ° āĻ¸āĻĻāĻ¸ā§āĻ¯āĻ¤āĻž āĻ¨āĻŋāĻ¤ā§‡, āĻĻā§āĻŸāĻŋ āĻāĻšā§āĻ›āĻŋāĻ• āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ: ReliableUdpMessageTypes messageType āĻāĻŦāĻ‚ IPEndPoint ipEndPointāĨ¤

āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻ•āĻžāĻ°:

public enum ReliableUdpMessageTypes : short
{ 
  // ЛŅŽĐąĐžĐĩ
  Any = 0,
  // ЗаĐŋŅ€ĐžŅ Đē STUN server 
  StunRequest = 1,
  // ОŅ‚вĐĩŅ‚ ĐžŅ‚ STUN server
  StunResponse = 2,
  // ПĐĩŅ€ĐĩĐ´Đ°Ņ‡Đ° Ņ„Đ°ĐšĐģĐ°
  FileTransfer =3,
  // ...
}

āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋ āĻ…āĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸āĻ­āĻžāĻŦā§‡ āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ; āĻāĻ° āĻœāĻ¨ā§āĻ¯, āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻŽāĻĄā§‡āĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§‡:

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

āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ¸āĻ¤ā§āĻ¯ āĻšāĻŦā§‡ - āĻ¯āĻĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻžāĻŸāĻŋ āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻžāĻĒāĻ•ā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻĒā§ŒāĻāĻ›ā§‡ āĻāĻŦāĻ‚ āĻŽāĻŋāĻĨā§āĻ¯āĻž - āĻ¯āĻĻāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ:

public bool EndSendMessage(IAsyncResult asyncResult)

āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋ. āĻĨā§āĻ°ā§‡āĻĄ āĻŽā§āĻ¯āĻžāĻšāĻŋāĻ‚ āĻŽā§‡āĻ•āĻžāĻ¨āĻŋāĻœāĻŽ, āĻŦā§āĻ¯āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ āĻāĻŦāĻ‚ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻŋāĻ‚, āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻŽā§‡āĻ¸ā§‡āĻœ āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻŽā§‚āĻ˛, āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ° āĻŦāĻŋāĻŦāĻ°āĻŖ, āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻŦāĻ‚ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§€āĻŽāĻž āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻž, āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻžāĻ›ā§‡ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻšāĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤

āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ āĻĄā§‡āĻ˛āĻŋāĻ­āĻžāĻ°āĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻŸāĻŋ āĻĒā§‚āĻ°ā§āĻŦā§‡ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻĒā§‚āĻ°āĻŖ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻāĻŦāĻ‚ āĻ¨āĻŽāĻ¨ā§€āĻ¯āĻŧāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¯ā§‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻĨā§āĻ°ā§āĻĒā§āĻŸ āĻŦāĻžāĻĄāĻŧāĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻ—āĻ¤āĻŋāĻļā§€āĻ˛āĻ­āĻžāĻŦā§‡ āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻĒāĻŋāĻ°āĻŋāĻ¯āĻŧāĻĄ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡, āĻ¸ā§āĻ˛āĻžāĻ‡āĻĄāĻŋāĻ‚ āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹ āĻāĻŦāĻ‚ RTT āĻāĻ° āĻŽāĻ¤ā§‹ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻāĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¨ā§‹āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ MTU āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĻ“ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻšāĻŦā§‡ (āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¯āĻĻāĻŋ āĻŦāĻĄāĻŧ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧ )

āĻ†āĻĒāĻ¨āĻžāĻ° āĻŽāĻ¨ā§‹āĻ¯ā§‹āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ, āĻ†āĻŽāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻāĻŦāĻ‚ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ›āĻŋāĨ¤

PS āĻ¯āĻžāĻ°āĻž āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻœāĻžāĻ¨āĻ¤ā§‡ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻŦāĻž āĻ•ā§‡āĻŦāĻ˛ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯, GitHube-āĻ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ˛āĻŋāĻ™ā§āĻ•:
āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ UDP āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ

āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻ˛āĻŋāĻ™ā§āĻ• āĻāĻŦāĻ‚ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§

  1. TCP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ¸ā§āĻĒā§‡āĻ¸āĻŋāĻĢāĻŋāĻ•ā§‡āĻļāĻ¨: Đ°ĐŊĐŗĐģиКŅĐēĐžĐŧ Đ°ĐŊĐŗĐģиКŅĐēĐžĐŧ и āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻŽāĻ§ā§āĻ¯ā§‡
  2. UDP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻ¸ā§āĻĒā§‡āĻ¸āĻŋāĻĢāĻŋāĻ•ā§‡āĻļāĻ¨: Đ°ĐŊĐŗĐģиКŅĐēĐžĐŧ Đ°ĐŊĐŗĐģиКŅĐēĐžĐŧ и āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻŽāĻ§ā§āĻ¯ā§‡
  3. RUDP āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ā§‡āĻ° āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž: āĻ–āĻ¸āĻĄāĻŧāĻž-ietf-sigtran-āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯-udp-00
  4. āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛: āĻ†āĻ°āĻāĻĢāĻ¸āĻŋ 908 и āĻ†āĻ°āĻāĻĢāĻ¸āĻŋ 1151
  5. UDP-āĻāĻ° āĻ‰āĻĒāĻ° āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤āĻ•āĻ°āĻŖā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻšāĻœ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨: .NET āĻāĻŦāĻ‚ UDP āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚ āĻāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¨āĻŋāĻ¯āĻŧāĻ¨ā§āĻ¤ā§āĻ°āĻŖ āĻ¨āĻŋāĻ¨
  6. NAT āĻŸā§āĻ°āĻžāĻ­āĻžāĻ°ā§āĻ¸āĻžāĻ˛ āĻŽā§‡āĻ•āĻžāĻ¨āĻŋāĻœāĻŽ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°ā§‡ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§: āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ…āĻ¨ā§āĻŦāĻžāĻĻāĻ• āĻœā§āĻĄāĻŧā§‡ āĻĒāĻŋāĻ¯āĻŧāĻžāĻ°-āĻŸā§-āĻĒāĻŋāĻ¯āĻŧāĻžāĻ° āĻ•āĻŽāĻŋāĻ‰āĻ¨āĻŋāĻ•ā§‡āĻļāĻ¨
  7. āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻŽāĻĄā§‡āĻ˛ā§‡āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨: CLR āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻŽāĻĄā§‡āĻ˛ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻž и āĻ•āĻŋāĻ­āĻžāĻŦā§‡ IAsyncResult āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻŦā§‡āĻ¨
  8. āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻŽāĻĄā§‡āĻ˛āĻ•ā§‡ āĻŸāĻžāĻ¸ā§āĻ•-āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ā§‡ āĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°āĻž (TAP-āĻ APM):
    TPL āĻāĻŦāĻ‚ āĻāĻ¤āĻŋāĻšā§āĻ¯āĻ—āĻ¤ .NET āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚
    āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ•āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĒ āĻ•āĻ°ā§āĻ¨

āĻ†āĻĒāĻĄā§‡āĻŸ: āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ mayorovp и sidristij āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ā§‡ āĻāĻ•āĻŸāĻŋ āĻŸāĻžāĻ¸ā§āĻ• āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻ§āĻžāĻ°āĻŖāĻžāĻ° āĻœāĻ¨ā§āĻ¯āĨ¤ āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻŋāĻ‚ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ° āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯ āĻ˛āĻ™ā§āĻ˜āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž, āĻ•āĻžāĻ°āĻŖ 4āĻ°ā§āĻĨ āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• XP āĻāĻŦāĻ‚ 2003 āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ‰āĻ­āĻ¯āĻŧāĻ•ā§‡āĻ‡ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡āĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨