C# .āύ⧇āϟ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āωāĻ¨ā§āύāϤ āϏāĻžāχāĻ•ā§āϞāĻŋāĻ‚ āĻŦāĻž āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ-āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ

āĻĒā§āϰāĻŦ⧇āĻļ

āĻāϟāĻŋ āϏāĻŦ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āϝāĻ–āύ āĻāĻ•āϜāύ āϏāĻšāĻ•āĻ°ā§āĻŽā§€ āφāĻŽāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āϛ⧋āϟ āĻ“āϝāĻŧ⧇āĻŦ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ āĻĻ⧇āύāĨ¤ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϟāĻŋāĻ¨ā§āĻĄāĻžāϰ⧇āϰ āĻŽāϤ⧋ āĻ•āĻŋāϛ⧁ āĻšāĻ“āϝāĻŧāĻžāϰ āĻ•āĻĨāĻž āĻ›āĻŋāϞ, āϤāĻŦ⧇ āĻāĻ•āϟāĻŋ āφāχāϟāĻŋ āĻšā§āϝāĻžāĻ™ā§āĻ—āφāωāĻŸā§‡āϰ āϜāĻ¨ā§āϝ⧎ āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰāĻŋāϤāĻžāϟāĻŋ āĻāϕ⧇āĻŦāĻžāϰ⧇āχ āϏāĻšāϜ, āφāĻĒāύāĻŋ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰ⧁āύ, āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻĒā§‚āϰāĻŖ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻŽā§‚āϞ āĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡ āϝāĻžāύ, āϝāĻĨāĻž, āĻāĻ•āϜāύ āĻ•āĻĨā§‹āĻĒāĻ•āĻĨāύ āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āφāĻĒāύāĻžāϰ āϏāĻ‚āϝ⧋āĻ—āϗ⧁āϞāĻŋ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āύāϤ⧁āύ āĻĒāϰāĻŋāϚāĻŋāϤāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ⧎

āĻāĻ–āĻžāύ⧇ āφāĻŽāĻžāϕ⧇ āύāĻŋāĻœā§‡āϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻŋāϛ⧁āϟāĻž āĻŦāĻŋāĻ­ā§āϰāĻžāĻ¨ā§āϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇, āϝāĻžāϤ⧇ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻāϟāĻŋ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āĻšāϝāĻŧ āϝ⧇ āφāĻŽāĻŋ āϕ⧇āύ āωāĻ¨ā§āύāϝāĻŧāύ⧇ āĻāĻŽāύ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āύāĻŋāϞāĻžāĻŽāĨ¤

āĻāχ āĻŽā§āĻšā§āĻ°ā§āϤ⧇ āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āϗ⧇āĻŽ āĻ¸ā§āϟ⧁āĻĄāĻŋāĻ“āϤ⧇ āĻŸā§‡āĻ•āύāĻŋāĻ•ā§āϝāĻžāϞ āφāĻ°ā§āϟāĻŋāĻ¸ā§āĻŸā§‡āϰ āĻĒāĻĻ⧇ āφāĻ›āĻŋ, āφāĻŽāĻžāϰ āϏāĻŋ# āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻŋāĻ‚ āĻ…āĻ­āĻŋāĻœā§āĻžāϤāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āχāωāύāĻŋāϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻāĻŦāĻ‚ āχāωāϟāĻŋāϞāĻŋāϟāĻŋāϗ⧁āϞāĻŋ āϞ⧇āĻ–āĻžāϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āϰāϝāĻŧ⧇āĻĄ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āύāĻŋāĻŽā§āύ-āĻ¸ā§āϤāϰ⧇āϰ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻĒā§āϞāĻžāĻ—āχāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāĨ¤ āĻāχ āĻŦāĻŋāĻļā§āĻŦ⧇āϰ āĻŦāĻžāχāϰ⧇, āφāĻŽāĻŋ āĻāĻ–āύāĻ“ āĻŦ⧇āϛ⧇ āύāĻŋāχāύāĻŋ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āϏ⧁āϝ⧋āĻ— āϤ⧈āϰāĻŋ āĻ•āϰāĻŋāύāĻŋāĨ¤

āĻĒāĻžāĻ°ā§āϟ 1. āĻĢā§āϰ⧇āĻŽ āĻĒā§āϰ⧋āĻŸā§‹āϟāĻžāχāĻĒāĻŋāĻ‚

āĻāχ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϟāĻŋ āϕ⧇āĻŽāύ āĻšāĻŦ⧇ āϤāĻž āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύ⧇āĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇, āφāĻŽāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāĻŋāĨ¤ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻšāϜ āωāĻĒāĻžāϝāĻŧ āĻš'āϞ āĻ•āĻŋāϛ⧁ āϧāϰāϪ⧇āϰ āϰ⧇āĻĄāĻŋāĻŽā§‡āĻĄ āϏāĻŽāĻžāϧāĻžāύ āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāĻž, āϝāĻžāϰ āωāĻĒāϰ, āĻāĻ•āϟāĻŋ āĻ—ā§āϞ⧋āĻŦ⧇āϰ āĻĒ⧇āρāϚāĻžāϰ āĻŽāϤ⧋, āφāĻĒāύāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āĻŽā§‡āĻ•āĻžāύāĻŋāĻ•ā§āϏ āϟāĻžāύāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āϜāύāϏāĻžāϧāĻžāϰāϪ⧇āϰ āύāĻŋāĻ¨ā§āĻĻāĻžāϰ āϜāĻ¨ā§āϝ āĻĒ⧁āϰ⧋ āϜāĻŋāύāĻŋāϏāϟāĻŋ āϏāĻžāϜāĻžāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤
āϤāĻŦ⧇ āĻāϟāĻŋ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ āύāϝāĻŧ, āφāĻŽāĻŋ āĻāϤ⧇ āϕ⧋āύāĻ“ āĻšā§āϝāĻžāϞ⧇āĻžā§āϜ āĻāĻŦāĻ‚ āĻŦā§‹āϧ āĻĻ⧇āĻ–āĻŋāύāĻŋ āĻāĻŦāĻ‚ āϤāĻžāχ āφāĻŽāĻŋ āĻ“āϝāĻŧ⧇āĻŦ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋ āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āϗ⧇āϰ āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋ āĻ…āĻ§ā§āϝāϝāĻŧāύ āĻ•āϰāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāĻŋāĨ¤

āĻ—āĻŦ⧇āώāĻŖāĻžāϟāĻŋ C# .Net-āĻ āύāĻŋāĻŦāĻ¨ā§āϧ āĻāĻŦāĻ‚ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āĻĻ⧇āĻ–āĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āĻāĻ–āĻžāύ⧇ āφāĻŽāĻŋ āĻ•āĻžāϜāϟāĻŋ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāĻžāϰ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āωāĻĒāĻžāϝāĻŧ āϖ⧁āρāĻœā§‡ āĻĒ⧇āϝāĻŧ⧇āĻ›āĻŋāĨ¤ ASP.Net āĻŦāĻž Azure āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻŽāϤ⧋ āĻĒā§‚āĻ°ā§āĻŖāĻžāĻ™ā§āĻ— āϏāĻŽāĻžāϧāĻžāύ āĻĨ⧇āϕ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇ TcpHttp āϏāĻ‚āϝ⧋āĻ—āϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϏāϰāĻžāϏāϰāĻŋ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āϏāĻžāĻĨ⧇ āχāĻ¨ā§āϟāĻžāϰāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧇āĻ•āϗ⧁āϞāĻŋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϰāϝāĻŧ⧇āϛ⧇⧎

ASP āĻāϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻĨāĻŽ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āφāĻŽāĻŋ āĻ…āĻŦāĻŋāϞāĻŽā§āĻŦ⧇ āĻāϟāĻŋ āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧇ āĻĻāĻŋāϝāĻŧ⧇āĻ›āĻŋ, āφāĻŽāĻžāϰ āĻŽāϤ⧇ āĻāϟāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āϜāĻ¨ā§āϝ āϖ⧁āĻŦ āĻ•āĻ āĻŋāύ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āĻ›āĻŋāϞāĨ¤ āφāĻŽāϰāĻž āĻāχ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡āϰ āĻ•ā§āώāĻŽāϤāĻžāϰ āĻāĻ• āϤ⧃āϤ⧀āϝāĻŧāĻžāĻ‚āĻļāĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ āύāĻž, āϤāĻžāχ āφāĻŽāĻŋ āφāĻŽāĻžāϰ āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϗ⧇āϞāĻžāĻŽāĨ¤ āϟāĻŋāϏāĻŋāĻĒāĻŋ āĻāĻŦāĻ‚ āĻāχāϚāϟāĻŋāϟāĻŋāĻĒāĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ-āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻĒāĻ›āĻ¨ā§āĻĻāϟāĻŋ āĻāϏ⧇āϛ⧇āĨ¤ āĻāĻ–āĻžāύ⧇, āĻšāĻžāĻŦā§āϰ⧇āϤ⧇, āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āύāĻŋāĻŦāĻ¨ā§āϧ āϜ⧁āĻĄāĻŧ⧇ āĻāϏ⧇āĻ›āĻŋ āĻŽāĻžāĻ˛ā§āϟāĻŋāĻĨā§āϰ⧇āĻĄ āϏāĻžāĻ°ā§āĻ­āĻžāϰ, āϝāĻž āϏāĻ‚āĻ—ā§āϰāĻš āĻāĻŦāĻ‚ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āφāĻŽāĻŋ TCP āϏāĻ‚āϝ⧋āϗ⧇āϰ āϏāĻžāĻĨ⧇ āχāĻ¨ā§āϟāĻžāϰāĻ…ā§āϝāĻžāĻ•ā§āϟ āĻ•āϰāĻžāϰ āωāĻĒāϰ āĻĢā§‹āĻ•āĻžāϏ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ, āĻ•āĻŋāϛ⧁ āĻ•āĻžāϰāϪ⧇ āφāĻŽāĻŋ āϭ⧇āĻŦ⧇āĻ›āĻŋāϞāĻžāĻŽ āϝ⧇ http āφāĻŽāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āĻ•ā§āϰāϏ-āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āϏāĻŽāĻžāϧāĻžāύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āĻŦ⧇ āύāĻžāĨ¤

āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻĒā§āϰāĻĨāĻŽ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇ āϏāĻ‚āϝ⧋āĻ—āϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻž, āĻ¸ā§āĻŸā§āϝāĻžāϟāĻŋāĻ• āĻ“āϝāĻŧ⧇āĻŦ āĻĒ⧃āĻˇā§āĻ āĻžāϰ āϏāĻžāĻŽāĻ—ā§āϰ⧀ āĻĒāϰāĻŋāĻŦ⧇āĻļāύ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ›āĻŋāϞāĨ¤ āĻāĻŦāĻ‚ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻŽāĻŋ āϏāĻžāχāĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ⧀ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ, āϝāĻžāϤ⧇ āĻĒāϰ⧇ āφāĻŽāĻŋ āĻāĻ–āĻžāύ⧇ āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āϰāϝāĻŧ⧇āĻĄ āĻāĻŦāĻ‚ āφāχāĻ“āĻāϏ-āĻ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāĻŖāϕ⧇ āϟāĻžāχ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

āĻāĻ–āĻžāύ⧇ āĻ•āĻŋāϛ⧁ āϕ⧋āĻĄ āφāϛ⧇
āĻāĻ•āϟāĻŋ āĻ…āĻ¨ā§āϤāĻšā§€āύ āϞ⧁āĻĒ⧇ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻ—ā§āϰāĻšāĻŖāĻ•āĻžāϰ⧀ āĻĒā§āϰāϧāĻžāύ āĻĨā§āϰ⧇āĻĄ:

using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace ClearServer
{

    class Server
    {
        TcpListener Listener;
        public Server(int Port)
        {
            Listener = new TcpListener(IPAddress.Any, Port);
            Listener.Start();

            while (true)
            {
                TcpClient Client = Listener.AcceptTcpClient();
                Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
                Thread.Start(Client);
            }
        }

        static void ClientThread(Object StateInfo)
        {
            new Client((TcpClient)StateInfo);
        }

        ~Server()
        {
            if (Listener != null)
            {
                Listener.Stop();
            }
        }

        static void Main(string[] args)
        {
            DatabaseWorker sqlBase = DatabaseWorker.GetInstance;

            new Server(80);
        }
    }
}

āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āύāĻŋāĻœā§‡āχ:

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace ClearServer
{
    class Client
    {


        public Client(TcpClient Client)
        {

            string Message = "";
            byte[] Buffer = new byte[1024];
            int Count;
            while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
            {
                Message += Encoding.UTF8.GetString(Buffer, 0, Count);

                if (Message.IndexOf("rnrn") >= 0 || Message.Length > 4096)
                {
                    Console.WriteLine(Message);
                    break;
                }
            }

            Match ReqMatch = Regex.Match(Message, @"^w+s+([^s?]+)[^s]*s+HTTP/.*|");
            if (ReqMatch == Match.Empty)
            {
                ErrorWorker.SendError(Client, 400);
                return;
            }
            string RequestUri = ReqMatch.Groups[1].Value;
            RequestUri = Uri.UnescapeDataString(RequestUri);
            if (RequestUri.IndexOf("..") >= 0)
            {
                ErrorWorker.SendError(Client, 400);
                return;
            }
            if (RequestUri.EndsWith("/"))
            {
                RequestUri += "index.html";
            }

            string FilePath =

quot;D:/Web/TestSite{RequestUri}";

if (!File.Exists(FilePath))
{
ErrorWorker.SendError(Client, 404);
return;
}

string Extension = RequestUri.Substring(RequestUri.LastIndexOf('.'));

string ContentType = "";

switch (Extension)
{
case ".htm":
case ".html":
ContentType = "text/html";
break;
case ".css":
ContentType = "text/css";
break;
case ".js":
ContentType = "text/javascript";
break;
case ".jpg":
ContentType = "image/jpeg";
break;
case ".jpeg":
case ".png":
case ".gif":
ContentType =


quot;image/{Extension.Substring(1)}";
break;
default:
if (Extension.Length > 1)
{
ContentType =


quot;application/{Extension.Substring(1)}";
}
else
{
ContentType = "application/unknown";
}
break;
}

FileStream FS;
try
{
FS = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (Exception)
{
ErrorWorker.SendError(Client, 500);
return;
}

string Headers =


quot;HTTP/1.1 200 OKnContent-Type: {ContentType}nContent-Length: {FS.Length}nn";
byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);

while (FS.Position < FS.Length)
{
Count = FS.Read(Buffer, 0, Buffer.Length);
Client.GetStream().Write(Buffer, 0, Count);
}

FS.Close();
Client.Close();
}
}
}


āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ SQL āĻ āύāĻŋāĻ°ā§āĻŽāĻŋāϤ āĻĒā§āϰāĻĨāĻŽ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ:
using System;
using System.Data.Linq;
namespace ClearServer
{
    class DatabaseWorker
    {

        private static DatabaseWorker instance;

        public static DatabaseWorker GetInstance
        {
            get
            {
                if (instance == null)
                    instance = new DatabaseWorker();
                return instance;
            }
        }


        private DatabaseWorker()
        {
            string connectionStr = databasePath;
            using (DataContext db = new DataContext(connectionStr))
            {
                Table<User> users = db.GetTable<User>();
                foreach (var item in users)
                {
                    Console.WriteLine(

quot;{item.login} {item.password}");
}
}
}
}
}


āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ, āĻāχ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖāϟāĻŋ āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āĻĨ⧇āϕ⧇ āϏāĻžāĻŽāĻžāĻ¨ā§āϝ āĻ­āĻŋāĻ¨ā§āύāĨ¤ āĻĒā§āϰāĻ•ā§ƒāϤāĻĒāĻ•ā§āώ⧇, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰ āĻĨ⧇āϕ⧇ āĻĒ⧃āĻˇā§āĻ āĻž āϞ⧋āĻĄ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻāĻ–āĻžāύ⧇ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ (āϝāĻž, āωāĻĒāĻžāϝāĻŧ āĻĻā§āĻŦāĻžāϰāĻž, āϭ⧁āϞ āϏāĻ‚āϝ⧋āĻ— āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ⧇āϰ āĻ•āĻžāϰāϪ⧇ āĻāχ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āύāĻŋ)āĨ¤

āĻ…āĻ§ā§āϝāĻžāϝāĻŧ 2

āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āφāĻŽāĻŋ āωāĻĒāϏāĻ‚āĻšāĻžāϰ⧇ āĻāϏ⧇āĻ›āĻŋ āϝ⧇ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻĻ⧁āĻ°ā§āĻĻāĻžāĻ¨ā§āϤ āϏāĻŽāĻžāϧāĻžāύ āĻšāĻŦ⧇ (āĻ¸ā§āĻĒāϝāĻŧāϞāĻžāϰ: āύāĻž), āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āϜāĻ¨ā§āϝ, āϤāĻžāχ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋ āϝ⧁āĻ•ā§āϤāĻŋ āĻ…āĻ°ā§āϜāύ āĻ•āϰāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇āĻ›āĻŋāϞāĨ¤
āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇, āύāϤ⧁āύ āĻŽāĻĄāĻŋāωāϞ āφāĻŦāĻŋāĻ°ā§āĻ­ā§‚āϤ āĻšāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰāĻŋāϤāĻž āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻšāϝāĻŧāĨ¤ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻāĻ•āϟāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻžāĻŽā§‚āϞāĻ• āĻĄā§‹āĻŽā§‡āχāύ āĻ…āĻ°ā§āϜāύ āĻ•āϰ⧇ āĻāĻŦāĻ‚ SSL āϏāĻ‚āϝ⧋āĻ— āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύāĨ¤

āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϝ⧁āĻ•ā§āϤāĻŋ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāĻĻ⧇āϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāϪ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧇ āĻāĻ•āϟ⧁ āĻŦ⧇āĻļāĻŋ āϕ⧋āĻĄ
āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āφāĻĒāĻĄā§‡āϟ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ, āĻāĻ•āϟāĻŋ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āϏāĻšāĨ¤

using System;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Security;
using System.Security.Cryptography.X509Certificates;
using System.Security.Permissions;
using System.Security.Policy;
using System.Threading;


namespace ClearServer
{

    sealed class Server
    {
        readonly bool ServerRunning = true;
        readonly TcpListener sslListner;
        public static X509Certificate serverCertificate = null;
        Server()
        {
            serverCertificate = X509Certificate.CreateFromSignedFile(@"C:sslitinder.online.crt");
            sslListner = new TcpListener(IPAddress.Any, 443);
            sslListner.Start();
            Console.WriteLine("Starting server.." + serverCertificate.Subject + "n" + Assembly.GetExecutingAssembly().Location);
            while (ServerRunning)
            {
                TcpClient SslClient = sslListner.AcceptTcpClient();
                Thread SslThread = new Thread(new ParameterizedThreadStart(ClientThread));
                SslThread.Start(SslClient);
            }
            
        }
        static void ClientThread(Object StateInfo)
        {
            new Client((TcpClient)StateInfo);
        }

        ~Server()
        {
            if (sslListner != null)
            {
                sslListner.Stop();
            }
        }

        public static void Main(string[] args)
        {
            if (AppDomain.CurrentDomain.IsDefaultAppDomain())
            {
                Console.WriteLine("Switching another domain");
                new AppDomainSetup
                {
                    ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase
                };
                var current = AppDomain.CurrentDomain;
                var strongNames = new StrongName[0];
                var domain = AppDomain.CreateDomain(
                    "ClearServer", null,
                    current.SetupInformation, new PermissionSet(PermissionState.Unrestricted),
                    strongNames);
                domain.ExecuteAssembly(Assembly.GetExecutingAssembly().Location);
            }
            new Server();
        }
    }
}

āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ ssl āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ…āύ⧁āĻŽā§‹āĻĻāύ āϏāĻš āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ:

using ClearServer.Core.Requester;
using System;
using System.Net.Security;
using System.Net.Sockets;

namespace ClearServer
{
    public class Client
    {
        public Client(TcpClient Client)
        {
            SslStream SSlClientStream = new SslStream(Client.GetStream(), false);
            try
            {
                SSlClientStream.AuthenticateAsServer(Server.serverCertificate, clientCertificateRequired: false, checkCertificateRevocation: true);
            }
            catch (Exception e)
            {
                Console.WriteLine(
                    "---------------------------------------------------------------------n" +


quot;|{DateTime.Now:g}n|------------n|{Client.Client.RemoteEndPoint}n|------------n|Exception: {e.Message}n|------------n|Authentication failed - closing the connection.n" +
"---------------------------------------------------------------------n");
SSlClientStream.Close();
Client.Close();
}
new RequestContext(SSlClientStream, Client);
}

}
}


āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝ⧇āĻšā§‡āϤ⧁ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϟāĻŋāϏāĻŋāĻĒāĻŋ āϏāĻ‚āϝ⧋āϗ⧇ āĻāĻ•āĻšā§‡āϟāĻŋāϝāĻŧāĻžāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇, āϤāĻžāχ āĻāĻ•āϟāĻŋ āĻŽāĻĄāĻŋāωāϞ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ āϝāĻž āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻĒā§āϰāϏāĻ™ā§āĻ— āϚāĻŋāύāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āφāĻŽāĻŋ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ āϝ⧇ āĻāĻ–āĻžāύ⧇ āĻāĻ•āϟāĻŋ āĻĒāĻžāĻ°ā§āϏāĻžāϰ āωāĻĒāϝ⧁āĻ•ā§āϤ āϝ⧇āϟāĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āĻ…āύ⧁āϰ⧋āϧāϟāĻŋāϕ⧇ āφāϞāĻžāĻĻāĻž āĻ…āĻ‚āĻļ⧇ āĻŦāĻŋāĻ­āĻ•ā§āϤ āĻ•āϰāĻŦ⧇ āϝāĻžāϰ āϏāĻžāĻĨ⧇ āφāĻŽāĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϕ⧇ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āωāĻ¤ā§āϤāϰ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤

āĻĒāĻžāĻ°ā§āϏāĻžāϰ

using ClearServer.Core.UserController;
using ReServer.Core.Classes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Security;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace ClearServer.Core.Requester
{
    public class RequestContext
    {
        public string Message = "";
        private readonly byte[] buffer = new byte[1024];
        public string RequestMethod;
        public string RequestUrl;
        public User RequestProfile;
        public User CurrentUser = null;
        public List<RequestValues> HeadersValues;
        public List<RequestValues> FormValues;
        private TcpClient TcpClient;

        private event Action<SslStream, RequestContext> OnRead = RequestHandler.OnHandle;

        DatabaseWorker databaseWorker = new DatabaseWorker();

        public RequestContext(SslStream ClientStream, TcpClient Client)
        {

            this.TcpClient = Client;
            try
            {
                ClientStream.BeginRead(buffer, 0, buffer.Length, ClientRead, ClientStream);
            }
            catch { return; }
        }
        private void ClientRead(IAsyncResult ar)
        {
            SslStream ClientStream = (SslStream)ar.AsyncState;

            if (ar.IsCompleted)
            {
                Message = Encoding.UTF8.GetString(buffer);
                Message = Uri.UnescapeDataString(Message);
                Console.WriteLine(

quot;n{DateTime.Now:g} Client IP:{TcpClient.Client.RemoteEndPoint}n{Message}");
RequestParse();
HeadersValues = HeaderValues();
FormValues = ContentValues();
UserParse();
ProfileParse();
OnRead?.Invoke(ClientStream, this);
}
}

private void RequestParse()
{
Match methodParse = Regex.Match(Message, @"(^w+)s+([^s?]+)[^s]*s+HTTP/.*|");
RequestMethod = methodParse.Groups[1].Value.Trim();
RequestUrl = methodParse.Groups[2].Value.Trim();
}
private void UserParse()
{
string cookie;
try
{
if (HeadersValues.Any(x => x.Name.Contains("Cookie")))
{
cookie = HeadersValues.FirstOrDefault(x => x.Name.Contains("Cookie")).Value;
try
{
CurrentUser = databaseWorker.CookieValidate(cookie);
}
catch { }
}
}
catch { }

}
private List<RequestValues> HeaderValues()
{
var values = new List<RequestValues>();
var parse = Regex.Matches(Message, @"(.*?): (.*?)n");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim()
});
}
return values;
}

private void ProfileParse()
{
if (RequestUrl.Contains("@"))
{
RequestProfile = databaseWorker.FindUser(RequestUrl.Substring(2));
RequestUrl = "/profile";
}
}
private List<RequestValues> ContentValues()
{
var values = new List<RequestValues>();
var output = Message.Trim('n').Split().Last();
var parse = Regex.Matches(output, @"([^&].*?)=([^&]*b)");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim().Replace('+', ' ')
});
}
return values;
}
}
}


āĻāϰ āϏāĻžāϰāĻžāĻ‚āĻļ āĻāχ āϏāĻ¤ā§āϝ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ āϝ⧇ āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āĻāĻ•ā§āϏāĻĒā§āϰ⧇āĻļāύ⧇āϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āĻ…āύ⧁āϰ⧋āϧāϟāĻŋāϕ⧇ āĻ…āĻ‚āĻļ⧇ āĻŦāĻŋāĻ­āĻ•ā§āϤ āĻ•āϰāĻžāĨ¤ āφāĻŽāϰāĻž āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āĻ•āĻžāĻ› āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ°ā§āϤāĻž āĻĒāĻžāχ, āĻĒā§āϰāĻĨāĻŽ āϞāĻžāχāύāϟāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ, āϝāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒāĻĻā§āϧāϤāĻŋ āĻāĻŦāĻ‚ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ url āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āϤāĻžāϰāĻĒāϰ⧇ āφāĻŽāϰāĻž āĻļāĻŋāϰ⧋āύāĻžāĻŽāϗ⧁āϞāĻŋ āĻĒāĻĄāĻŧāĻŋ, āϝ⧇āϗ⧁āϞāĻŋāϕ⧇ āφāĻŽāϰāĻž HeaderName = Content āĻĢāĻ°ā§āĻŽā§‡āϰ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāϰ⧇āϤ⧇ āĻĄā§āϰāĻžāχāĻ­ āĻ•āϰāĻŋ, āĻāĻŦāĻ‚ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āϝāĻĻāĻŋ āĻĨāĻžāϕ⧇, āϏāĻžāĻĨ⧇ āĻĨāĻžāĻ•āĻž āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁ (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, querystring) āϖ⧁āρāĻœā§‡ āĻĒāĻžāχ āϝāĻž āφāĻŽāϰāĻž āĻāĻ•āχ āĻ…ā§āϝāĻžāϰ⧇āϤ⧇ āĻĄā§āϰāĻžāχāĻ­ āĻ•āϰāĻŋāĨ¤ āωāĻĒāϰāĻ¨ā§āϤ⧁, āĻĒāĻžāĻ°ā§āϏāĻžāϰ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻ•āĻŋāύāĻž āϤāĻž āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϤāĻžāϰ āĻĄā§‡āϟāĻž āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āĨ¤ āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāĻĻ⧇āϰ āĻĨ⧇āϕ⧇ āϏāĻŽāĻ¸ā§āϤ āĻ…āύ⧁āϰ⧋āϧ⧇ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āĻŽā§‹āĻĻāύ āĻšā§āϝāĻžāĻļ āĻĨāĻžāϕ⧇, āϝāĻž āϕ⧁āĻ•āĻŋāϤ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻĨāĻžāϕ⧇, āϝāĻžāϰ āĻ•āĻžāϰāϪ⧇ āĻĻ⧁āχ āϧāϰāύ⧇āϰ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āφāϰāĻ“ āĻ•āĻžāĻœā§‡āϰ āϝ⧁āĻ•ā§āϤāĻŋ āφāϞāĻžāĻĻāĻž āĻ•āϰāĻž āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āϏāĻ āĻŋāĻ• āωāĻ¤ā§āϤāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž āϏāĻŽā§āĻ­āĻŦāĨ¤

āĻ āĻŋāĻ• āφāϛ⧇, āĻāĻ•āϟāĻŋ āϛ⧋āϟ, āϏ⧁āĻ¨ā§āĻĻāϰ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āϝāĻž āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āĻŽāĻĄāĻŋāωāϞ⧇ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰāĻŋāϤ āĻ•āϰāĻž āωāϚāĻŋāϤ, "site.com/@UserName" āĻāϰ āĻŽāϤ⧋ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋāϕ⧇ āĻ—āϤāĻŋāĻļā§€āϞāĻ­āĻžāĻŦ⧇ āϤ⧈āϰāĻŋ āĻšāĻ“āϝāĻŧāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒ⧃āĻˇā§āĻ āĻžāϗ⧁āϞāĻŋāϤ⧇ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰāĻŋāϤ āĻ•āϰ⧇⧎ āĻ…āύ⧁āϰ⧋āϧāϟāĻŋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻŽāĻĄāĻŋāωāϞāϗ⧁āϞāĻŋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻšāϝāĻŧāĨ¤

āĻ…āĻ§ā§āϝāĻžāϝāĻŧ 3. āĻšā§āϝāĻžāĻ¨ā§āĻĄā§‡āϞāĻŦāĻžāϰ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž, āĻšā§‡āχāύ āϞ⧁āĻŦā§āϰāĻŋāϕ⧇āϟāĻŋāĻ‚

āĻĒāĻžāĻ°ā§āϏāĻžāϰ⧇āϰ āĻ•āĻžāϜ āĻļ⧇āώ āĻšāĻ“āϝāĻŧāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻĨ⧇, āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āĻ•āĻžāϜ āĻ•āϰ⧇, āϏāĻžāĻ°ā§āĻ­āĻžāϰāϕ⧇ āφāϰāĻ“ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻĻ⧇āϝāĻŧ āĻāĻŦāĻ‚ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖāϕ⧇ āĻĻ⧁āϟāĻŋ āĻ­āĻžāϗ⧇ āĻ­āĻžāĻ— āĻ•āϰ⧇āĨ¤

āϏāĻšāϜ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ

using ClearServer.Core.UserController;
using System.Net.Security;
namespace ClearServer.Core.Requester
{
    public class RequestHandler
    {
        public static void OnHandle(SslStream ClientStream, RequestContext context)
        {

            if (context.CurrentUser != null)
            {
                new AuthUserController(ClientStream, context);
            }
            else 
            {
                new NonAuthUserController(ClientStream, context);
            };
        }
    }
}

āφāϏāϞ⧇, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…āύ⧁āĻŽā§‹āĻĻāύ⧇āϰ āϜāĻ¨ā§āϝ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āĻšā§‡āĻ• āφāϛ⧇, āϝāĻžāϰ āĻĒāϰ⧇ āĻ…āύ⧁āϰ⧋āϧ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϰāĻŖ āĻļ⧁āϰ⧁ āĻšāϝāĻŧāĨ¤

āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ
āϝāĻĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ āύāĻž āĻšāϝāĻŧ, āϤāĻŦ⧇ āϤāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰāĻŋāϤāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻāĻŦāĻ‚ āĻ…āύ⧁āĻŽā§‹āĻĻāύ āύāĻŋāĻŦāĻ¨ā§āϧāύ āωāχāĻ¨ā§āĻĄā§‹āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āϕ⧋āĻĄ āĻāĻ•āχ āĻĻ⧇āĻ–āĻžāϝāĻŧ, āϤāĻžāχ āφāĻŽāĻŋ āĻāϟāĻŋ āύāĻ•āϞ āĻ•āϰāĻžāϰ āϕ⧋āύ āĻ•āĻžāϰāĻŖ āĻĻ⧇āĻ–āĻŋ āύāĻžāĨ¤

āĻ…āύāύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀

using ClearServer.Core.Requester;
using System.IO;
using System.Net.Security;

namespace ClearServer.Core.UserController
{
    internal class NonAuthUserController
    {
        private readonly SslStream ClientStream;
        private readonly RequestContext Context;
        private readonly WriteController WriteController;
        private readonly AuthorizationController AuthorizationController;

        private readonly string ViewPath = "C:/Users/drdre/source/repos/ClearServer/View";

        public NonAuthUserController(SslStream clientStream, RequestContext context)
        {
            this.ClientStream = clientStream;
            this.Context = context;
            this.WriteController = new WriteController(clientStream);
            this.AuthorizationController = new AuthorizationController(clientStream, context);
            ResourceLoad();
        }

        void ResourceLoad()
        {
            string[] blockextension = new string[] {"cshtml", "html", "htm"};
            bool block = false;
            foreach (var item in blockextension)
            {
                if (Context.RequestUrl.Contains(item))
                {
                    block = true;
                    break;
                }
            }
            string FilePath = "";
            string Header = "";
            var RazorController = new RazorController(Context, ClientStream);
            
            switch (Context.RequestMethod)
            {
                case "GET":
                    switch (Context.RequestUrl)
                    {
                        case "/":
                            FilePath = ViewPath + "/loginForm.html";
                            Header =

quot;HTTP/1.1 200 OKnContent-Type: text/html";
WriteController.DefaultWriter(Header, FilePath);
break;
case "/profile":
RazorController.ProfileLoader(ViewPath);
break;
default:
//в даĐŊĐŊĐžĐŧ ĐąĐģĐžĐēĐĩ ĐēОда ĐŋŅ€ĐžĐ¸ŅŅ…ĐžĐ´Đ¸Ņ‚ ĐžŅ‚ŅĐĩ҇ĐĩĐŊиĐĩ СаĐŋŅ€ĐžŅĐžĐ˛ Đē ҁĐĩŅ€Đ˛ĐĩŅ€Ņƒ ĐŋĐž ĐŋŅ€ŅĐŧĐžĐŧ҃ Đ°Đ´Ņ€Đĩҁ҃ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹ вида site.com/page.html
if (!File.Exists(ViewPath + Context.RequestUrl) | block)
{
RazorController.ErrorLoader(404);

}
else if (Path.HasExtension(Context.RequestUrl) && File.Exists(ViewPath + Context.RequestUrl))
{
Header = WriteController.ContentType(Context.RequestUrl);
FilePath = ViewPath + Context.RequestUrl;
WriteController.DefaultWriter(Header, FilePath);
}
break;
}
break;

case "POST":
AuthorizationController.MethodRecognizer();
break;

}

}

}
}


āĻāĻŦāĻ‚ āĻ…āĻŦāĻļā§āϝāχ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻĒ⧃āĻˇā§āĻ āĻžāϗ⧁āϞāĻŋāϰ āĻ•āĻŋāϛ⧁ āĻŦāĻŋāώāϝāĻŧāĻŦāĻ¸ā§āϤ⧁ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇, āϤāĻžāχ āωāĻ¤ā§āϤāϰāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻŽāĻĄāĻŋāωāϞāϟāĻŋ āϰāϝāĻŧ⧇āϛ⧇, āϝāĻž āϏāĻ‚āĻ¸ā§āĻĨāĻžāύāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āωāĻ¤ā§āϤāϰ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻĻāĻžāϝāĻŧ⧀⧎

āϞ⧇āĻ–āĻ• āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ

using System;
using System.IO;
using System.Net.Security;
using System.Text;

namespace ClearServer.Core.UserController
{
    public class WriteController
    {
        SslStream ClientStream;
        public WriteController(SslStream ClientStream)
        {
            this.ClientStream = ClientStream;
        }

        public void DefaultWriter(string Header, string FilePath)
        {
            FileStream fileStream;
            try
            {
                fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
                Header =

quot;{Header}nContent-Length: {fileStream.Length}nn";
ClientStream.Write(Encoding.UTF8.GetBytes(Header));
byte[] response = new byte[fileStream.Length];
fileStream.BeginRead(response, 0, response.Length, OnFileRead, response);
}
catch { }
}

public string ContentType(string Uri)
{
string extension = Path.GetExtension(Uri);
string Header = "HTTP/1.1 200 OKnContent-Type:";
switch (extension)
{
case ".html":
case ".htm":
return


quot;{Header} text/html";
case ".css":
return


quot;{Header} text/css";
case ".js":
return


quot;{Header} text/javascript";
case ".jpg":
case ".jpeg":
case ".png":
case ".gif":
return


quot;{Header} image/{extension}";
default:
if (extension.Length > 1)
{
return


quot;{Header} application/" + extension.Substring(1);
}
else
{
return


quot;{Header} application/unknown";
}
}
}

public void OnFileRead(IAsyncResult ar)
{
if (ar.IsCompleted)
{
var file = (byte[])ar.AsyncState;
ClientStream.BeginWrite(file, 0, file.Length, OnClientSend, null);
}
}

public void OnClientSend(IAsyncResult ar)
{
if (ar.IsCompleted)
{
ClientStream.Close();
}
}
}


āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϤāĻžāϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āĻĻ⧇āĻ–āĻžāύ⧋āϰ āϜāĻ¨ā§āϝ, āφāĻŽāĻŋ RazorEngine āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ, āĻŦāĻž āĻŦāϰāĻ‚ āĻāϰ āĻāĻ•āϟāĻŋ āĻ…āĻ‚āĻļāĨ¤ āĻāϤ⧇ āĻ–āĻžāϰāĻžāĻĒ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻž āĻāĻŦāĻ‚ āωāĻĒāϝ⧁āĻ•ā§āϤ āĻ¤ā§āϰ⧁āϟāĻŋ āϕ⧋āĻĄ āϜāĻžāϰāĻŋ āĻ•āϰāĻžāĻ“ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤāĨ¤

āϰ⧇āϜāĻžāϰ āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ

using ClearServer.Core.Requester;
using RazorEngine;
using RazorEngine.Templating;
using System;
using System.IO;
using System.Net;
using System.Net.Security;

namespace ClearServer.Core.UserController
{
    internal class RazorController
    {
        private RequestContext Context;
        private SslStream ClientStream;
        dynamic PageContent;


        public RazorController(RequestContext context, SslStream clientStream)
        {
            this.Context = context;
            this.ClientStream = clientStream;

        }

        public void ProfileLoader(string ViewPath)
        {
            string Filepath = ViewPath + "/profile.cshtml";
            if (Context.RequestProfile != null)
            {
                if (Context.CurrentUser != null && Context.RequestProfile.login == Context.CurrentUser.login)
                {
                    try
                    {
                        PageContent = new { isAuth = true, Name = Context.CurrentUser.name, Login = Context.CurrentUser.login, Skills = Context.CurrentUser.skills };
                        ClientSend(Filepath, Context.CurrentUser.login);
                    }
                    catch (Exception e) { Console.WriteLine(e); }

                }
                else
                {
                    try
                    {
                        PageContent = new { isAuth = false, Name = Context.RequestProfile.name, Login = Context.RequestProfile.login, Skills = Context.RequestProfile.skills };
                        ClientSend(Filepath, "PublicProfile:"+ Context.RequestProfile.login);
                    }
                    catch (Exception e) { Console.WriteLine(e); }
                }
            }
            else
            {
                ErrorLoader(404);
            }


        }

        public void ErrorLoader(int Code)
        {
            try
            {
                PageContent = new { ErrorCode = Code, Message = ((HttpStatusCode)Code).ToString() };
                string ErrorPage = "C:/Users/drdre/source/repos/ClearServer/View/Errors/ErrorPage.cshtml";
                ClientSend(ErrorPage, Code.ToString());
            }
            catch { }

        }

        private void ClientSend(string FilePath, string Key)
        {
            var template = File.ReadAllText(FilePath);
            var result = Engine.Razor.RunCompile(template, Key, null, (object)PageContent);
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(result);
            ClientStream.BeginWrite(buffer, 0, buffer.Length, OnClientSend, ClientStream);
        }

        private void OnClientSend(IAsyncResult ar)
        {
            if (ar.IsCompleted)
            {
                ClientStream.Close();
            }
        }
    }
}

āĻāĻŦāĻ‚ āĻ…āĻŦāĻļā§āϝāχ, āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϝāĻžāϚāĻžāχāĻ•āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ, āĻ…āύ⧁āĻŽā§‹āĻĻāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āĻ…āύ⧁āĻŽā§‹āĻĻāύ āĻŽāĻĄāĻŋāωāϞ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻ•āϰ⧇āĨ¤ āϏāĻžāχāĻŸā§‡āϰ āĻĢāĻ°ā§āĻŽāϗ⧁āϞāĻŋ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻžāĻĒā§āϤ āĻĄā§‡āϟāĻž āĻĒā§āϰāϏāĻ™ā§āĻ— āĻĨ⧇āϕ⧇ āĻĒāĻžāĻ°ā§āϏ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ⧇ āϕ⧁āĻ•āĻŋāϜ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒāĻžāϝāĻŧāĨ¤

āĻ…āύ⧁āĻŽā§‹āĻĻāύ āĻŽāĻĄāĻŋāωāϞ

using ClearServer.Core.Cookies;
using ClearServer.Core.Requester;
using ClearServer.Core.Security;
using System;
using System.Linq;
using System.Net.Security;
using System.Text;

namespace ClearServer.Core.UserController
{
    internal class AuthorizationController
    {
        private SslStream ClientStream;
        private RequestContext Context;
        private UserCookies cookies;
        private WriteController WriteController;
        DatabaseWorker DatabaseWorker;
        RazorController RazorController;
        PasswordHasher PasswordHasher;
        public AuthorizationController(SslStream clientStream, RequestContext context)
        {
            ClientStream = clientStream;
            Context = context;
            DatabaseWorker = new DatabaseWorker();
            WriteController = new WriteController(ClientStream);
            RazorController = new RazorController(context, clientStream);
            PasswordHasher = new PasswordHasher();
        }

        internal void MethodRecognizer()
        {
            if (Context.FormValues.Count == 2 && Context.FormValues.Any(x => x.Name == "password")) Authorize();
            else if (Context.FormValues.Count == 3 && Context.FormValues.Any(x => x.Name == "regPass")) Registration();
            else
            {
                RazorController.ErrorLoader(401);
            }
        }

        private void Authorize()
        {
            var values = Context.FormValues;
            var user = new User()
            {
                login = values[0].Value,
                password = PasswordHasher.PasswordHash(values[1].Value)
            };
            user = DatabaseWorker.UserAuth(user);
            if (user != null)
            {
                cookies = new UserCookies(user.login, user.password);
                user.cookie = cookies.AuthCookie;
                DatabaseWorker.UserUpdate(user);
                var response = Encoding.UTF8.GetBytes(

quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {cookies.AuthCookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);

}
else
{
RazorController.ErrorLoader(401);

}
}

private void Registration()
{
var values = Context.FormValues;
var user = new User()
{
name = values[0].Value,
login = values[1].Value,
password = PasswordHasher.PasswordHash(values[2].Value),
};
cookies = new UserCookies(user.login, user.password);
user.cookie = cookies.AuthCookie;
if (DatabaseWorker.LoginValidate(user.login))
{
Console.WriteLine("User ready");
Console.WriteLine(


quot;{user.password} {user.password.Trim().Length}");
DatabaseWorker.UserRegister(user);
var response = Encoding.UTF8.GetBytes(


quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {user.cookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);
}
else
{
RazorController.ErrorLoader(401);
}
}
}
}


āĻāĻŦāĻ‚ āĻĄāĻžāϟāĻžāĻŦ⧇āϏāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻāχāϰāĻ•āĻŽ:

āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ

using ClearServer.Core.UserController;
using System;
using System.Data.Linq;
using System.Linq;

namespace ClearServer
{
    class DatabaseWorker
    {

        private readonly Table<User> users = null;
        private readonly DataContext DataBase = null;
        private const string connectionStr = @"ĐŋŅƒŅ‚ŅŒĐēйаСĐĩ";

        public DatabaseWorker()
        {
            DataBase = new DataContext(connectionStr);
            users = DataBase.GetTable<User>();
        }

        public User UserAuth(User User)
        {
            try
            {
                var user = users.SingleOrDefault(t => t.login.ToLower() == User.login.ToLower() && t.password == User.password);
                if (user != null)
                    return user;
                else
                    return null;
            }
            catch (Exception)
            {
                return null;
            }

        }

        public void UserRegister(User user)
        {
            try
            {
                users.InsertOnSubmit(user);
                DataBase.SubmitChanges();
                Console.WriteLine(

quot;User{user.name} with id {user.uid} added");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}

}

public bool LoginValidate(string login)
{
if (users.Any(x => x.login.ToLower() == login.ToLower()))
{
Console.WriteLine("Login already exists");
return false;
}
return true;
}
public void UserUpdate(User user)
{
var UserToUpdate = users.FirstOrDefault(x => x.uid == user.uid);
UserToUpdate = user;
DataBase.SubmitChanges();
Console.WriteLine(


quot;User {UserToUpdate.name} with id {UserToUpdate.uid} updated");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
public User CookieValidate(string CookieInput)
{
User user = null;
try
{
user = users.SingleOrDefault(x => x.cookie == CookieInput);
}
catch
{
return null;
}
if (user != null) return user;
else return null;
}
public User FindUser(string login)
{
User user = null;
try
{
user = users.Single(x => x.login.ToLower() == login.ToLower());
if (user != null)
{
return user;
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
}
}


āĻāĻŦāĻ‚ āϏāĻŦāĻ•āĻŋāϛ⧁āχ āϘāĻĄāĻŧāĻŋāϰ āĻ•āĻžāϜ, āĻ…āύ⧁āĻŽā§‹āĻĻāύ āĻāĻŦāĻ‚ āύāĻŋāĻŦāĻ¨ā§āϧāύ⧇āϰ āĻ•āĻžāĻœā§‡āϰ āĻŽāϤ⧋ āĻ•āĻžāϜ āĻ•āϰ⧇, āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϟāĻŋāϤ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ⧇āϰ āĻ¨ā§āϝ⧂āύāϤāĻŽ āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰāĻŋāϤāĻž āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āωāĻĒāϞāĻŦā§āϧ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞ⧇āĻ–āĻžāϰ āĻāĻŦāĻ‚ āĻĒ⧁āϰ⧋ āϜāĻŋāύāĻŋāϏāϟāĻŋāϕ⧇ āĻŽā§‚āϞ āĻĢāĻžāĻ‚āĻļāύāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻŦāĻžāρāϧāĻžāϰ āϏāĻŽāϝāĻŧ āϝāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

āĻ…āĻ§ā§āϝāĻžāϝāĻŧ 4

āĻĻ⧁āϟāĻŋ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻĻ⧁āϟāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞ⧇āĻ–āĻžāϰ āĻļā§āϰāĻŽ āĻ–āϰāϚ āĻ•āĻŽāĻžāϤ⧇, āφāĻŽāĻŋ Xamarin.Forms-āĻ āĻāĻ•āϟāĻŋ āĻ•ā§āϰāϏ-āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋāĨ¤ āφāĻŦāĻžāϰ, āϧāĻ¨ā§āϝāĻŦāĻžāĻĻ āϝ⧇ āĻāϟāĻŋ C# āĻ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻžāĻŽā§‚āϞāĻ• āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϝāĻž āϕ⧇āĻŦāϞ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇, āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ āĻŽā§āĻšā§āĻ°ā§āϤ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϚāϞ⧇ āĻ—āĻŋāϝāĻŧ⧇āĻ›āĻŋāϞāĻžāĻŽāĨ¤ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϜāĻ¨ā§āϝ, āĻŽāϜāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻŽāĻŋ āĻāϟāĻŋ HttpClient-āĻ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ HttpRequestMessage āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻāϟāĻŋ āϛ⧁āĻĄāĻŧ⧇ āĻĻāĻŋāϝāĻŧ⧇āĻ›āĻŋ āϝāĻžāϤ⧇ json āĻŦāĻŋāĻ¨ā§āϝāĻžāϏ⧇ āĻ…āύ⧁āĻŽā§‹āĻĻāύ āĻĢāĻ°ā§āĻŽ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āϰāϝāĻŧ⧇āϛ⧇⧎ āĻŦāĻŋāĻļ⧇āώ āĻ•āĻŋāϛ⧁ āφāĻļāĻž āύāĻž āĻ•āϰ⧇, āφāĻŽāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϞāĻ— āϖ⧁āϞāϞāĻžāĻŽ āĻāĻŦāĻ‚ āϏ⧇āĻ–āĻžāύ⧇ āϏāĻŽāĻ¸ā§āϤ āĻĄā§‡āϟāĻž āϏāĻš āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ āĻĻ⧇āĻ–āϞāĻžāĻŽāĨ¤ āĻšāĻžāϞāĻ•āĻž āĻ¸ā§āϤāĻŦā§āϧāϤāĻž, āĻ—āϤ 3 āϏāĻĒā§āϤāĻžāĻšā§‡āϰ āύāĻŋāĻ¸ā§āϤ⧇āϜ āϏāĻ¨ā§āĻ§ā§āϝāĻžāϝāĻŧ āϝāĻž āĻ•āĻŋāϛ⧁ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϏāĻšā§‡āϤāύāϤāĻžāĨ¤ āĻĒā§āϰ⧇āϰāĻŋāϤ āĻĄā§‡āϟāĻžāϰ āϏāĻ āĻŋāĻ•āϤāĻž āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇, āφāĻŽāĻŋ HttpListner āĻ āĻāĻ•āϟāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰ⧇āĻ›āĻŋāĨ¤ āĻāϟāĻŋāϤ⧇ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻ…āύ⧁āϰ⧋āϧāϟāĻŋ āĻĒ⧇āϝāĻŧ⧇, āφāĻŽāĻŋ āϕ⧋āĻĄā§‡āϰ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϞāĻžāχāύ⧇ āĻāϟāĻŋāϕ⧇ āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ, āĻĢāĻ°ā§āĻŽ āĻĨ⧇āϕ⧇ KeyValuePair āĻĄā§‡āϟāĻž āĻĒ⧇āϝāĻŧ⧇āĻ›āĻŋāĨ¤ āĻ•ā§āϝ⧋āϝāĻŧāĻžāϰ⧀ āĻĒāĻžāĻ°ā§āϏāĻŋāĻ‚ āĻĻ⧁āχ āϞāĻžāχāύ⧇ āĻ•āĻŽāĻžāύ⧋ āĻšāϝāĻŧ⧇āϛ⧇āĨ¤

āφāĻŽāĻŋ āφāϰāĻ“ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻļ⧁āϰ⧁ āĻ•āϰ⧇āĻ›āĻŋ, āĻāϟāĻŋ āφāϗ⧇ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋ, āϤāĻŦ⧇ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āφāĻŽāĻŋ āĻāĻ–āύāĻ“ āĻ“āϝāĻŧ⧇āĻŦāϏāϕ⧇āϟāϗ⧁āϞāĻŋāϤ⧇ āύāĻŋāĻ°ā§āĻŽāĻŋāϤ āĻāĻ•āϟāĻŋ āĻšā§āϝāĻžāϟ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧇āĻ›āĻŋāĨ¤ āĻāϟāĻŋ āĻŦ⧇āĻļ āĻ­āĻžāϞ āĻ•āĻžāϜ āĻ•āϰ⧇āĻ›āĻŋāϞ, āĻ•āĻŋāĻ¨ā§āϤ⧁ Tcp-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāĻžāϰ āύ⧀āϤāĻŋāϟāĻŋ āĻšāϤāĻžāĻļāĻžāϜāύāĻ• āĻ›āĻŋāϞ, āϚāĻŋāĻ āĻŋāĻĒāĻ¤ā§āϰ⧇āϰ āϞāĻ—āĻŋāĻ‚āϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ āĻĻ⧁āχ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻž āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϖ⧁āĻŦ āĻŦ⧇āĻļāĻŋ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āωāĻ¤ā§āĻĒāĻžāĻĻāύ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ¸ā§āϝ⧁āχāϚāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ āĻĒāĻžāĻ°ā§āϏ āĻ•āϰāĻž āĻāĻŦāĻ‚ RFC 6455 āĻĒā§āϰ⧋āĻŸā§‹āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāĻžā§ˇ āĻ…āϤāĻāĻŦ, āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇, āφāĻŽāĻŋ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻ“āϝāĻŧ⧇āĻŦāϏāϕ⧇āϟ āϏāĻ‚āϝ⧋āĻ— āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ⧎ āĻŦāĻŋāĻļ⧁āĻĻā§āϧ āĻ¸ā§āĻŦāĻžāĻ°ā§āĻĨ⧇āϰ āϜāĻ¨ā§āϝāĨ¤

āĻšā§āϝāĻžāϟ āϏāĻ‚āϝ⧋āĻ—

 private static async void HandleWebsocket(HttpListenerContext context)
        {
            var socketContext = await context.AcceptWebSocketAsync(null);
            var socket = socketContext.WebSocket;
            Locker.EnterWriteLock();
            try
            {
                Clients.Add(socket);
            }
            finally
            {
                Locker.ExitWriteLock();
            }

            while (true)
            {
                var buffer = new ArraySegment<byte>(new byte[1024]);
                var result = await socket.ReceiveAsync(buffer, CancellationToken.None);
                var str = Encoding.Default.GetString(buffer);
                Console.WriteLine(str);

                for (int i = 0; i < Clients.Count; i++)
                {
                    WebSocket client = Clients[i];

                    try
                    {
                        if (client.State == WebSocketState.Open)
                        {
                            
                            await client.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                        }
                    }
                    catch (ObjectDisposedException)
                    {
                        Locker.EnterWriteLock();
                        try
                        {
                            Clients.Remove(client);
                            i--;
                        }
                        finally
                        {
                            Locker.ExitWriteLock();
                        }
                    }
                }
            }
        }

āĻāĻŦāĻ‚ āĻāϟāĻž āĻ•āĻžāϜ āĻ•āϰ⧇. āϏāĻžāĻ°ā§āĻ­āĻžāϰ āύāĻŋāĻœā§‡āχ āϏāĻ‚āϝ⧋āĻ— āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧇āϛ⧇, āĻāĻ•āϟāĻŋ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϕ⧀ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āϛ⧇āĨ¤ āĻāĻŽāύāĻ•āĻŋ āφāĻŽāĻžāϕ⧇ āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ ssl āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāϤ⧇ āĻšāϝāĻŧāύāĻŋ, āĻāϟāĻŋ āϝāĻĨ⧇āĻˇā§āϟ āϝ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒā§‹āĻ°ā§āĻŸā§‡ āĻāĻ•āϟāĻŋ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āφāϛ⧇āĨ¤

āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āĻĒāĻžāĻļ⧇ āĻāĻŦāĻ‚ āϏāĻžāχāĻŸā§‡āϰ āĻĒāĻžāĻļ⧇, āĻĻ⧁āϟāĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻŦāĻžāĻ°ā§āϤāĻž āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ•āϰ⧇āϛ⧇, āĻāχ āϏāĻŦāχ āϞāĻ— āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āϕ⧋āύ āĻŦāĻŋāĻļāĻžāϞ āĻĒāĻžāĻ°ā§āϏāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϕ⧇ āϧ⧀āϰ āĻ•āϰ⧇ āĻĻāĻŋāĻšā§āϛ⧇ āύāĻž, āĻāϰ āϕ⧋āύāϟāĻŋāϰāχ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻ›āĻŋāϞ āύāĻžāĨ¤ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϏāĻŽāϝāĻŧ 200ms āĻĨ⧇āϕ⧇ āĻ•āĻŽāĻŋāϝāĻŧ⧇ 40-30ms āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāĻŦāĻ‚ āφāĻŽāĻŋ āĻāĻ•āĻŽāĻžāĻ¤ā§āϰ āϏāĻ āĻŋāĻ• āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ⧇ āĻāϏ⧇āĻ›āĻŋāĨ¤

C# .āύ⧇āϟ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āωāĻ¨ā§āύāϤ āϏāĻžāχāĻ•ā§āϞāĻŋāĻ‚ āĻŦāĻž āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ-āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ

Tcp-āĻ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύāϟāĻŋ āĻĢ⧇āϞ⧇ āĻĻāĻŋāύ āĻāĻŦāĻ‚ Http-āĻāϰ āĻ…āϧ⧀āύ⧇ āϏāĻŦāĻ•āĻŋāϛ⧁ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϞāĻŋāϖ⧁āύāĨ¤ āĻāĻ–āύ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĄāĻŋāϜāĻžāχāύ⧇āϰ āĻĒāĻ°ā§āϝāĻžāϝāĻŧ⧇ āϰāϝāĻŧ⧇āϛ⧇, āϤāĻŦ⧇ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϟāĻŋāϰ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ­āĻŋāĻ¨ā§āύ āύ⧀āϤāĻŋ āĻ…āύ⧁āϏāĻžāϰ⧇āĨ¤ āĻĄāĻŋāĻ­āĻžāχāϏ āĻāĻŦāĻ‚ āϏāĻžāχāĻŸā§‡āϰ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ āϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāχāϜ āĻāĻŦāĻ‚ āĻĄāĻŋāĻŦāĻžāĻ— āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āϧāĻžāϰāĻŖāĻž āϰāϝāĻŧ⧇āϛ⧇, āĻāĻ•āĻŽāĻžāĻ¤ā§āϰ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āϝ⧇ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋāϰ āĻāχāϚāϟāĻŋāĻāĻŽāĻāϞ āĻĒ⧃āĻˇā§āĻ āĻžāϗ⧁āϞāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύ⧇āχ⧎

āωāĻĒāϏāĻ‚āĻšāĻžāϰ

"āĻĢā§‹āĻ°ā§āĻĄ āύāĻž āĻœā§‡āύ⧇, āϜāϞ⧇ āĻŽāĻžāĻĨāĻž āϠ⧁āĻ•āĻŦ⧇āύ āύāĻž" āφāĻŽāĻŋ āĻŽāύ⧇ āĻ•āϰāĻŋ, āĻ•āĻžāϜ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āφāϗ⧇, āφāĻŽāĻžāϰ āϞāĻ•ā§āĻˇā§āϝ āĻāĻŦāĻ‚ āωāĻĻā§āĻĻ⧇āĻļā§āϝāϗ⧁āϞāĻŋ āφāϰāĻ“ āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰāĻž āωāϚāĻŋāϤ āĻ›āĻŋāϞ, āϏ⧇āχāϏāĻžāĻĨ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāĻĻ⧇āϰ āωāĻĒāϰ āϤāĻžāĻĻ⧇āϰ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋ āĻāĻŦāĻ‚ āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋ āĻ…āĻ§ā§āϝāϝāĻŧāύ āĻ•āϰāĻž āωāϚāĻŋāϤ āĻ›āĻŋāϞāĨ¤ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒāϟāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āϏāĻŽāĻžāĻĒā§āϤāĻŋāϰ āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāĻŋ āφāĻŦāĻžāϰ āĻ•āĻŋāϛ⧁ āϜāĻŋāύāĻŋāϏ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ–āĻžāϰāĻžāĻĒ āĻ•āϰ⧇āĻ›āĻŋ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāϤ⧇ āĻĢāĻŋāϰ⧇ āφāϏāĻŦāĨ¤ āωāĻ¨ā§āύāϝāĻŧāύ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϚāϞāĻžāĻ•āĻžāϞ⧀āύ āφāĻŽāĻŋ āĻ…āύ⧇āĻ• āĻ•āĻŋāϛ⧁ āĻļāĻŋāϖ⧇āĻ›āĻŋ, āϤāĻŦ⧇ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻ•āĻŋāϛ⧁ āĻļ⧇āĻ–āĻžāϰ āφāϛ⧇āĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāχ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻĒāĻĄāĻŧ⧇ āĻĨāĻžāϕ⧇āύ, āϤāĻžāĻšāϞ⧇ āĻĒāĻĄāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āϧāĻ¨ā§āϝāĻŦāĻžāĻĻāĨ¤

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster