เบเบฒเบ™เบ‚เบตเปˆเบฅเบปเบ”เบ–เบตเบšเปเบšเบšเบžเบดเป€เบชเบ” เบซเบผเบทเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป€เบŠเบตเบšเป€เบงเบตเบ•เบฒเบก C# .Net framework

เป€เบ‚เบปเป‰เบฒ

เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป€เบกเบทเปˆเบญเป€เบžเบทเปˆเบญเบ™เบฎเปˆเบงเบกเบ‡เบฒเบ™เปเบ™เบฐเบ™เปเบฒเบงเปˆเบฒเบ‚เป‰เบญเบเบชเป‰เบฒเบ‡เบšเปเบฅเบดเบเบฒเบ™เป€เบงเบฑเบšเป„เบŠเบ•เปŒเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ. เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ›เบฑเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™ Tinder, เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบเบนเบ‡เบŠเบปเบ™ IT. เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”, เบ—เปˆเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™, เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปƒเบชเปˆ profile เปเบฅเบฐเบเป‰เบฒเบเป„เบ›เบชเบนเปˆเบˆเบธเบ”เบ•เบปเป‰เบ™เบ•เป, เบ„เบทเบเบฒเบ™เบŠเบญเบเบซเบฒเบ„เบปเบ™เบ—เบตเปˆเบˆเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเปเบฅเบฐเบ‚เบฐเบซเบเบฒเบเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบฅเบฐเบชเป‰เบฒเบ‡เบ„เบปเบ™เบฎเบนเป‰เบˆเบฑเบเปƒเบซเบกเปˆ.

เปƒเบ™เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡ retreat เปเบฅเบฐเบšเบญเบเป€เบฅเบฑเบเบ™เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบ™เป€เบญเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบกเบฑเบ™เบˆเบฐเบŠเบฑเบ”เป€เบˆเบ™เบเบงเปˆเบฒเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบญเบปเบฒเบšเบฒเบ”เบเป‰เบฒเบงเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ–เบทเบ•เปเบฒเปเบซเบ™เปˆเบ‡เบ™เบฑเบเบงเบดเบŠเบฒเบเบฒเบ™เปƒเบ™เบชเบฐเบ•เบนเบ”เบดเป‚เบญเป€เบเบกเบซเบ™เบถเปˆเบ‡, เบ›เบฐเบชเบปเบšเบเบฒเบ™เบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบกเบ‚เบญเบ‡เบ‚เป‰เบญเบเปƒเบ™ C# เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบชเบฐเบ„เบดเบšเปเบฅเบฐเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบš Unity เปเบฅเบฐเบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เบเบฒเบ™เบชเป‰เบฒเบ‡ plugins เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เบฅเบฐเบ”เบฑเบšเบ•เปˆเปเบฒเบเบฑเบšเบญเบธเบ›เบฐเบเบญเบ™ Android. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบเบฑเบ‡โ€‹เบšเปเปˆโ€‹เบ—เบฑเบ™โ€‹เป„เบ”เป‰โ€‹เบ›เบฐโ€‹เบ–เบดเป‰เบกโ€‹เบ„เบงเบฒเบกโ€‹เป€เบชเบโ€‹เบซเบฒเบโ€‹เป„เบ›โ€‹เบ™เบญเบโ€‹เป‚เบฅเบโ€‹เบ™เบตเป‰, เปเบฅเบฐโ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบเปโ€‹เบกเบตโ€‹เป‚เบญโ€‹เบเบฒเบ”โ€‹เบ”เบฑเปˆเบ‡โ€‹เบเปˆเบฒเบง.

เบชเปˆเบงเบ™เบ—เบต 1. เบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเปเบšเบšเบเบญเบš

เป‚เบ”เบเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”, เบ‚เป‰เบญเบเป€เบฅเบตเปˆเบกเบŠเบญเบเบซเบฒเบ—เบฒเบ‡เป€เบฅเบทเบญเบเปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”. เบชเบดเปˆเบ‡เบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบเบฒเบ™เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเปเบเป‰เป„เบ‚เบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเบšเบฒเบ‡เบŠเบฐเบ™เบดเบ”, เป€เบŠเบดเปˆเบ‡, เบ„เบทเบเบฑเบšเบ™เบปเบเบญเบดเบ™เบŠเบต, เบเบปเบ™เบˆเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ”เบถเบ‡เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปˆเบฒเบงเบซเบฒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ.
เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ, เบ‚เป‰เบญเบเบšเปเปˆเป€เบซเบฑเบ™เบชเบดเปˆเบ‡เบ—เป‰เบฒเบ—เบฒเบเบซเบผเบทเบ„เบงเบฒเบกเบฎเบนเป‰เบชเบถเบเปƒเบ”เป†เปƒเบ™เบกเบฑเบ™, เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบˆเบถเปˆเบ‡เป€เบฅเบตเปˆเบกเบชเบถเบเบชเบฒเป€เบ—เบเป‚เบ™เป‚เบฅเบเบตเป€เบงเบฑเบšเปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เบเบฑเบšเบžเบงเบเป€เบ‚เบปเบฒ.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบชเบถเบเบชเบฒเป‚เบ”เบเบเบฒเบ™เป€เบšเบดเปˆเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเปเบฅเบฐเป€เบญเบเบฐเบชเบฒเบ™เบเปˆเบฝเบงเบเบฑเบš C# .Net. เบ—เบตเปˆเบ™เบตเป‰เบ‚เป‰เบญเบเบžเบปเบšเบงเบดเบ—เบตเบ•เปˆเบฒเบ‡เป†เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบซเบ™เป‰เบฒเบงเบฝเบ. เบกเบตเบซเบผเบฒเบเบเบปเบ™เป„เบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เบเบฑเบšเป€เบ„เบทเบญเบ‚เปˆเบฒเบ, เบˆเบฒเบเบเบฒเบ™เปเบเป‰เป„เบ‚เป€เบ•เบฑเบกเบฎเบนเบšเปเบšเบšเป€เบŠเบฑเปˆเบ™: เบšเปเบฅเบดเบเบฒเบ™ ASP.Net เบซเบผเบท Azure, เป„เบ›เบซเบฒเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ TcpHttp.

เป‚เบ”เบเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เบเบฑเบš ASP, เบ‚เป‰เบญเบเบ›เบฐเบ•เบดเป€เบชเบ”เบ—เบฑเบ™เบ—เบต; เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบเบฒเบเป€เบเบตเบ™เป„เบ›เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเปƒเบŠเป‰เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เป€เบงเบ—เบตเบ™เบตเป‰, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบทเบšเบ•เปเปˆเบŠเบญเบเบซเบฒ. เบ—เบฒเบ‡เป€เบฅเบทเบญเบเปเบกเปˆเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ TCP เปเบฅเบฐ Http client-server. เบ—เบตเปˆเบ™เบตเป‰, เบเปˆเบฝเบงเบเบฑเบšHabre, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบกเบฒเปƒเบ™เบ—เบปเปˆเบงเบšเบปเบ”เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบš เป€เบŠเบตเบšเป€เบงเบต multithreaded, เป‚เบ”เบเป„เบ”เป‰เบฅเบงเบšเบฅเบงเบกเปเบฅเบฐเบ—เบปเบ”เบชเบญเบšเบกเบฑเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเบธเบกเปƒเบชเปˆเบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เบเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ TCP เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบ‚เป‰เบญเบเบ„เบดเบ”เบงเปˆเบฒ http เบˆเบฐเบšเปเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ‚เป‰เบญเบเบชเป‰เบฒเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เป‰เบฒเบกเป€เบงเบ—เบต.

เป€เบงเบตเบŠเบฑเปˆเบ™เบ—เบณเบญเบดเบ”เบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเบฅเบงเบกเบกเบตเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบฎเบฑเบšเปƒเบŠเป‰เป€เบ™เบทเป‰เบญเบซเบฒเปœเป‰เบฒเป€เบงเบฑเบšเปเบšเบšเบ„เบปเบ‡เบ—เบตเปˆ, เปเบฅเบฐเบฅเบงเบกเป€เบญเบปเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบœเบนเป‰เปƒเบŠเป‰. เปเบฅเบฐเป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเป‰เบฒเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบ™ Android เปเบฅเบฐ iOS.

เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฐเบซเบฑเบ”เบšเบฒเบ‡เบขเปˆเบฒเบ‡
เบเบฐเบ—เบนเป‰เบ•เบปเป‰เบ™เบ•เป, เบเบฒเบ™เบฎเบฑเบšเบฅเบนเบเบ„เป‰เบฒเปƒเบ™ loop เบšเปเปˆเบกเบตเบ—เบตเปˆเบชเบดเป‰เบ™เบชเบธเบ”:

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. Screwing เบฅเปเป‰

เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เปเบกเปˆโ€‹เบ‚เปˆเบฒเบโ€‹, เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบชเบฐโ€‹เบซเบผเบธเบšโ€‹เบงเปˆเบฒโ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบ—เบตเปˆโ€‹เบ”เบตโ€‹เป€เบฅเบตเบ” (spoiler: เบšเปเปˆ), เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป‚เบ„เบ‡เบเบฒเบ™เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเป€เบซเบ”เบœเบปเบ™.
เป€เบ—เบทเปˆเบญเบฅเบฐเบ‚เบฑเป‰เบ™เบ•เบญเบ™, เป‚เบกเบ”เบนเบ™เปƒเปเปˆเป€เบฅเบตเปˆเบกเบ›เบฒเบเบปเบ”เบ‚เบถเป‰เบ™ เปเบฅเบฐ เปœเป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เป€เบŠเบตเบšเป€เบงเบตเป„เบ”เป‰เบ‚เบฐเบซเบเบฒเบเบญเบญเบเป„เบ›. เป€เบŠเบตเบšเป€เบงเบตเป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เป€เบกเบ™เบ—เบปเบ”เบชเบญเบš เปเบฅเบฐ 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);
}

}
}


เปเบ•เปˆเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ TCP, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เป‚เบกเบ”เบนเบ™เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบฎเบฑเบšเบฎเบนเป‰เบชเบฐเบžเบฒเบšเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบงเปˆเบฒเบ•เบปเบงเบงเบดเป€เบ„เบฒเบฐเบˆเบฐเป€เบซเบกเบฒเบฐเบชเบปเบกเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบ—เบตเปˆเบˆเบฐเบ—เปเบฒเบฅเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบเบฅเบนเบเบ„เป‰เบฒเบญเบญเบเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบ‚เป‰เบญเบเบชเบฒเบกเบฒเบ”เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบšเบฅเบนเบเบ„เป‰เบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เบ„เปเบฒเบ•เบญเบšเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™.

parser

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 เบฎเป‰เบญเบ‡เบ‚เป. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบญเปˆเบฒเบ™เบซเบปเบงเบ‚เปเป‰, เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ array เบ‚เบญเบ‡เปเบšเบšเบŸเบญเบก HeaderName=Content, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบŠเบญเบเบซเบฒ, เบ–เป‰เบฒเบกเบต, เบกเบฒเบžเป‰เบญเบกเบเบฑเบšเป€เบ™เบทเป‰เบญเบซเบฒ (เบ•เบปเบงเบขเปˆเบฒเบ‡, querystring) เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ array เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, parser เบ„เบปเป‰เบ™เบžเบปเบšเบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เปเบฅเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบฅเบฒเบงเบซเบผเบทเบšเปเปˆ. เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฒเบเบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เบกเบต hash เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ cookies, เบเป‰เบญเบ™เบเบฒเบ™เบ™เบตเป‰เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเปเบเบเป€เบซเบ”เบœเบปเบ™เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ•เบทเปˆเบกเบญเบตเบเบชเปเบฒเบฅเบฑเบšเบฅเบนเบเบ„เป‰เบฒเบชเบญเบ‡เบ›เบฐเป€เบžเบ”เปเบฅเบฐเปƒเบซเป‰เบ„เปเบฒเบ•เบญเบšเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡.

เบ”เบต, เบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เบ‡เบฒเบกเบ—เบตเปˆเบˆเบฐเบ„เบธเป‰เบกเบ„เปˆเบฒเปƒเบชเปˆเปƒเบ™เป‚เบกเบ”เบนเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เบเบฒเบ™เบ›เปˆเบฝเบ™เบ„เปเบฒเบ–เบฒเบกเป€เบŠเบฑเปˆเบ™ "site.com/@UserName" เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบซเบ™เป‰เบฒเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบชเป‰เบฒเบ‡เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹, เป‚เบกโ€‹เบ”เบนเบ™โ€‹เบ”เบฑเปˆเบ‡โ€‹เบ•เปเปˆโ€‹เป„เบ›โ€‹เบ™เบตเป‰โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบกเบฒโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบซเบผเบดเป‰เบ™โ€‹.

เบšเบปเบ”เบ—เบต 3. เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบžเบงเบ‡เบกเบฒเป„เบฅ, lubrication เบ‚เบญเบ‡เบ•เปˆเบญเบ‡เป‚เบชเป‰

เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆ parser เป„เบ”เป‰เบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบ•เบปเบ™, handler เป€เบ‚เบปเป‰เบฒเบกเบฒเบซเบผเบดเป‰เบ™, เปƒเบซเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ•เปเปˆเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบฅเบฐเปเบšเปˆเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเป€เบ›เบฑเบ™เบชเบญเบ‡เบชเปˆเบงเบ™.

เบ•เบปเบงเบˆเบฑเบ”เบเบฒเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ

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;

}

}

}
}


เปเบฅเบฐเปเบ™เปˆเบ™เบญเบ™, เบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เป€เบ™เบทเป‰เบญเบซเบฒเบ‚เบญเบ‡เบซเบ™เป‰เบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบกเบตเป‚เบกเบ”เบนเบ™เบ•เปเปˆเป„เบ›เบ™เบตเป‰, เป€เบŠเบดเปˆเบ‡เบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ•เปเปˆเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ•เปเปˆเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™.

WriterController

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, เบซเบผเบทเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบกเบฑเบ™. เบกเบฑเบ™เบเบฑเบ‡เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบเบฒเบ™เบญเบญเบเบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก.

RazorController

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

เปเบฅเบฐเปเบ™เปˆเบ™เบญเบ™, เป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบญเบฐเบ™เบธเบเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบ, เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปเบกเปˆเบ™เบˆเปเบฒเป€เบ›เบฑเบ™. เป‚เบกเบ”เบนเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบžเบปเบงเบžเบฑเบ™เบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบˆเบฒเบโ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เป€เบงเบฑเบšโ€‹เป„เบŠโ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เปเบเบโ€‹เบˆเบฒเบโ€‹เบชเบฐโ€‹เบžเบฒเบšโ€‹เบเบฒเบ™โ€‹, เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบšเบฑเบ™โ€‹เบ—เบถเบโ€‹เป„เบงเป‰โ€‹เปเบฅเบฐโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบš cookies เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡โ€‹เบเบฒเบ™โ€‹เบšเปโ€‹เบฅเบดโ€‹เบเบฒเบ™โ€‹.

เป‚เบกเบ”เบนเบ™เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”

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


เปเบฅเบฐเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเป€เบŠเบฑเปˆเบ™: clockwork, เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปเบฅเบฐเบเบฒเบ™เบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™, เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปเบฅเป‰เบงเปเบฅเบฐเป€เบงเบฅเบฒเป„เบ”เป‰เบกเบฒเบ‚เบฝเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปเบฅเบฐเบœเบนเบเบกเบฑเบ”เบชเบดเปˆเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบฎเปˆเบงเบกเบเบฑเบ™เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”.

เบšเบปเบ”เบ—เบต 4. เบเบฒเบ™เบ–เบดเป‰เบกเบฅเบปเบ”เบ–เบตเบš

เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเปเบฎเบ‡เบ‡เบฒเบ™เปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบชเบญเบ‡เบชเปเบฒเบฅเบฑเบšเบชเบญเบ‡เปเบžเบฅเบฐเบ•เบฐเบŸเบญเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเป‰เบฒเบ‡เป€เบงเบ—เบตเบ‚เป‰เบฒเบกเบœเปˆเบฒเบ™ Xamarin.Forms. เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบกเบฑเบ™เบขเบนเปˆเปƒเบ™ C #. เป„เบ”เป‰เป€เบฎเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบตเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบžเบปเบšเป€เบซเบฑเบ™เบˆเบธเบ”เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบเบญเบธเบ›เบฐเบเบญเบ™, เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบกเปˆเบงเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™ HttpClient เปเบฅเบฐเบชเบปเปˆเบ‡เบกเบฑเบ™เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ HttpRequestMessage, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเปเบšเบšเบŸเบญเบกเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบ™เบฎเบนเบšเปเบšเบš json. เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ„เบฒเบ”เบซเบงเบฑเบ‡เบซเบเบฑเบ‡เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบ›เบตเบ”เบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบฅเบฐเป€เบซเบฑเบ™เบงเปˆเบฒเบกเบตเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบเบญเบธเบ›เบฐเบเบญเบ™เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”. เบญเบฒเบเบฒเบ™เบ‡เบถเบ”เบ‡เบปเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ, เบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เปƒเบ™ 3 เบญเบฒเบ—เบดเบ”เบœเปˆเบฒเบ™เบกเบฒเปƒเบ™เบ•เบญเบ™เปเบฅเบ‡เบ—เบตเปˆเบญเบดเบ”เป€เบกเบทเปˆเบญเบ. เป€เบžเบทเปˆเบญเบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡, เบ‚เป‰เบญเบเป„เบ”เป‰เบฅเบงเบšเบฅเบงเบกเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบขเบนเปˆเปƒเบ™ HttpListner. เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบญเบทเปˆเบ™เปเบฅเป‰เบงเบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบญเบปเบฒเบกเบฑเบ™เบญเบญเบเบˆเบฒเบเบเบฑเบ™เปƒเบ™เบชเบญเบ‡เบชเบฒเบกเป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™ KeyValuePair เบˆเบฒเบเปเบšเบšเบŸเบญเบก. เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบšเบšเบชเบญเบšเบ–เบฒเบกเป„เบ”เป‰เบ–เบทเบเบซเบผเบธเบ”เบฅเบปเบ‡เป€เบ›เบฑเบ™เบชเบญเบ‡เปเบ–เบง.

เบ‚เป‰เบญเบเป€เบฅเบตเปˆเบกเบ—เบปเบ”เบชเบญเบšเบ•เบทเปˆเบกเบญเบตเบ, เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบเปˆเบฒเบงเป€เบ–เบดเบ‡เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เปเบ•เปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบ‚เป‰เบญเบเบเบฑเบ‡เป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ websockets. เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบ”เบต, เปเบ•เปˆเบซเบผเบฑเบเบเบฒเบ™เบซเบผเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบœเปˆเบฒเบ™ Tcp เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบซเบปเบ”เบซเบนเปˆเบซเบผเบฒเบ; เบ™เบตเป‰เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เปเบเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป€เบžเบทเปˆเบญเบชเบฐเบซเบผเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปเบฅเบฐเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เป‚เบ”เบเปƒเบŠเป‰เป‚เบ›เป‚เบ•เบ„เบญเบ™ RFC 6455 เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ websocket เปเบšเบšเบ‡เปˆเบฒเบเบ”เบฒเบ. เบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบกเปˆเบงเบ™เบŠเบทเปˆเบ™.

เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒ

 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# .Net framework

เบ–เบดเป‰เบกเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบŠเบตเบŸเป€เบงเบตเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เปƒเบ™ Tcp เปเบฅเบฐเบ‚เบฝเบ™เบ„เบทเบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบžเบฒเบเปƒเบ•เป‰ Http. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบญเบญเบเปเบšเบšเปƒเบซเบกเปˆ, เปเบ•เปˆเบญเบตเบ‡เบ•เบฒเบกเบซเบผเบฑเบเบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš. เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ‚เบญเบ‡เบญเบธเบ›เบฐเบเบญเบ™เปเบฅเบฐเป€เบงเบฑเบšเป„เบŠเบ—เปŒเปเบกเปˆเบ™ synchronized เปเบฅเบฐ debugged เปเบฅเบฐเบกเบตเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบปเปˆเบงเป„เบ›, เบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบžเบฝเบ‡เปเบ•เปˆเบงเปˆเบฒเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบซเบ™เป‰เบฒ HTML เบชเปเบฒเบฅเบฑเบšเบญเบธเบ›เบฐเบเบญเบ™.

เบชเบฐเบซเบฅเบธเบš

"เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบฎเบนเป‰เบŸเบญเบ”, เบขเปˆเบฒเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ™เป‰เปเบฒ" เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบงเบ™เบˆเบฐเบกเบตเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเปเบฅเบฐเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบเบงเปˆเบฒ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบชเบถเบเบชเบฒเบเปˆเบฝเบงเบเบฑเบšเป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเปเบฅเบฐเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ•เปเปˆเบฅเบนเบเบ„เป‰เบฒเบ•เปˆเบฒเบ‡เป†. เป‚เบ„เบ‡เบเบฒเบ™เปƒเบเป‰เบˆเบฐเบชเบณเป€เบฅเบฑเบ”เปเบฅเป‰เบง, เปเบ•เปˆเบšเบฒเบ‡เบ—เบตเบ‚เป‰เบญเบเบญเบฒเบ”เบˆเบฐเบเบฑเบšเบกเบฒเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบญเบตเบเบ„เบฑเป‰เบ‡. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เบซเบผเบฒเบเบขเปˆเบฒเบ‡เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เปเบ•เปˆเบเบฑเบ‡เบกเบตเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป„เบ”เป‰เบญเปˆเบฒเบ™เบกเบฒเบฎเบญเบ”เบ™เบตเป‰, เบ‚เบญเบšเปƒเบˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster