เจเฉฐเจฆเจฐเจพเจเจผ
เจเจน เจธเจญ เจเจฆเฉเจ เจธเจผเฉเจฐเฉ เจนเฉเจเจ เจเจฆเฉเจ เจเฉฑเจ เจธเจนเจฟเจเจฐเจฎเฉ เจจเฉ เจธเฉเจเจพเจ
เจฆเจฟเฉฑเจคเจพ เจเจฟ เจฎเฉเจ เจเฉฑเจ เจเฉเจเฉ เจตเฉเจฌ เจธเฉเจตเจพ เจฌเจฃเจพเจตเจพเจ. เจเจน เจเจฟเฉฐเจกเจฐ เจตเจฐเจเจพ เจเฉเจ เจนเฉเจฃเจพ เจเจพเจนเฉเจฆเจพ เจธเฉ, เจชเจฐ เจเจเจเฉ เจญเฉเฉ เจฒเจ. เจเจพเจฐเจเจเฉเจธเจผเจฒเจคเจพ เจฌเจนเฉเจค เจนเฉ เจธเจงเจพเจฐเจจ เจนเฉ, เจคเฉเจธเฉเจ เจฐเจเจฟเจธเจเจฐ เจเจฐเฉ, เจเฉฑเจ เจชเฉเจฐเฉเจซเจพเจเจฒ เจญเจฐเฉ เจ
เจคเฉ เจฎเฉเฉฑเจ เจฌเจฟเฉฐเจฆเฉ 'เจคเฉ เจ
เฉฑเจเฉ เจตเจงเฉ, เจ
เจฐเจฅเจพเจค เจเฉฑเจฒ เจเจฐเจจ เจฒเจ เจเฉฑเจ เจตเจฟเจ
เจเจคเฉ เจจเฉเฉฐ เจฒเฉฑเจญเจฃเจพ เจ
เจคเฉ เจเจชเจฃเฉ เจเจจเฉเจเจธเจผเจจเจพเจ เจจเฉเฉฐ เจตเจงเจพเจเจฃเจพ เจ
เจคเฉ เจจเจตเฉเจ เจเจพเจฃเฉ เจฌเจฃเจพเจเจฃเจพเฅค
เจเฉฑเจฅเฉ เจฎเฉเจจเฉเฉฐ เจเฉฑเจ เจชเจฟเฉฑเจเฉ เจนเจเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจ เจคเฉ เจเจชเจฃเฉ เจฌเจพเจฐเฉ เจฅเฉเฉเจพ เจเจฟเจนเจพ เจฆเฉฑเจธเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ, เจคเจพเจ เจเฉ เจญเจตเจฟเฉฑเจ เจตเจฟเฉฑเจ เจเจน เจธเจชเฉฑเจธเจผเจ เจนเฉ เจธเจเฉ เจเจฟ เจฎเฉเจ เจตเจฟเจเจพเจธ เจตเจฟเฉฑเจ เจ เจเจฟเจนเฉ เจเจฆเจฎ เจเจฟเจเจ เจเฉเฉฑเจเฉ เจนเจจเฅค
เจเจธ เจธเจฎเฉเจ เจฎเฉเจฐเฉ เจเฉเจฒ เจเฉฑเจ เจเฉเจฎ เจธเจเฉเจกเฉเจ เจตเจฟเฉฑเจ เจคเจเจจเฉเจเฉ เจเจฒเจพเจเจพเจฐ เจฆเฉ เจธเจฅเจฟเจคเฉ เจนเฉ, C# เจตเจฟเฉฑเจ เจฎเฉเจฐเจพ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจคเจเจฐเจฌเจพ เจธเจฟเจฐเจซ เจเจเจคเจพ เจฒเจ เจธเจเฉเจฐเจฟเจชเจเจพเจ เจ เจคเฉ เจเจชเจฏเฉเจเจคเจพเจตเจพเจ เจจเฉเฉฐ เจฒเจฟเจเจฃ 'เจคเฉ เจฌเจฃเจพเจเจ เจเจฟเจ เจธเฉ เจ เจคเฉ เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจเจเจกเจฐเฉเจเจก เจกเจฟเจตเจพเจเจธเจพเจ เจจเจพเจฒ เจนเฉเจ เจฒเฉ-เจชเฉฑเจงเจฐ เจฆเฉ เจเฉฐเจฎ เจฒเจ เจชเจฒเฉฑเจเจเจจ เจฌเจฃเจพเจเจฃเจพ. เจฎเฉเจ เจ เจเฉ เจเจธ เจจเจฟเฉฑเจเฉ เจเจฟเจนเฉ เจฆเฉเจจเฉเจเจ เจคเฉเจ เจ เฉฑเจเฉ เจจเจฟเจเจฒเจฟเจ เจจเจนเฉเจ เจธเฉ เจเจฟ เจ เจเจฟเจนเจพ เจฎเฉเจเจพ เจ เจเจฟเจเฅค
เจญเจพเจ 1. เจซเจฐเฉเจฎ เจชเฉเจฐเฉเจเฉเจเจพเจเจชเจฟเฉฐเจ
เจเจน เจซเฉเจธเจฒเจพ เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ เจเจฟ เจเจน เจธเฉเจตเจพ เจเจฟเจธ เจคเจฐเฉเจนเจพเจ เจฆเฉ เจนเฉเจตเฉเจเฉ, เจฎเฉเจ เจฒเจพเจเฉ เจเจฐเจจ เจฒเจ เจตเจฟเจเจฒเจชเจพเจ เจฆเฉ เจเฉเจ เจเจฐเจจเฉ เจธเจผเฉเจฐเฉ เจเจฐ เจฆเจฟเฉฑเจคเฉเฅค เจธเจญ เจคเฉเจ เจเจธเจพเจจ เจเฉฑเจฒ เจเจน เจนเฉเจตเฉเจเฉ เจเจฟ เจเฉเจ เจ
เจเจฟเจนเจพ เจคเจฟเจเจฐ-เจฌเจฐ-เจคเจฟเจเจฐ เจนเฉฑเจฒ เจฒเฉฑเจญ เจฒเจฟเจ เจเจพเจตเฉ, เจเจฟเจธ เจฆเฉ เจเจงเจพเจฐ 'เจคเฉ เจเจฒเฉเจฌ 'เจคเฉ เจเฉฑเจฒเฉ เจตเจพเจเจ เจธเจพเจกเฉ เจฎเจเฉเจจเจฟเจเจพเจ เจจเฉเฉฐ เจเจฟเฉฑเจเจฟเจ เจเจพ เจธเจเฉ เจ
เจคเฉ เจธเจพเจฐเฉ เจเฉฑเจฒ เจจเฉเฉฐ เจเจจเจคเจ เจจเจฟเฉฐเจฆเจฟเจ เจฆเจพ เจธเจพเจนเจฎเจฃเจพ เจเฉเจคเจพ เจเจพ เจธเจเฉเฅค
เจชเจฐ เจเจน เจฆเจฟเจฒเจเจธเจช เจจเจนเฉเจ เจนเฉ, เจฎเฉเจจเฉเฉฐ เจเจธ เจตเจฟเฉฑเจ เจเฉเจ เจเฉเจฃเฉเจคเฉ เจเจพเจ เจญเจพเจตเจจเจพ เจจเจนเฉเจ เจฆเจฟเจเจพเจ เจฆเจฟเฉฑเจคเฉ, เจ
เจคเฉ เจเจธเจฒเจ เจฎเฉเจ เจตเฉเจฌ เจคเจเจจเจพเจฒเฉเจเฉเจเจ เจ
เจคเฉ เจเจนเจจเจพเจ เจจเจพเจฒ เจเฉฑเจฒเจฌเจพเจค เจเจฐเจจ เจฆเฉ เจคเจฐเฉเจเจฟเจเจ เจฆเจพ เจ
เจงเจฟเจเจจ เจเจฐเจจเจพ เจธเจผเฉเจฐเฉ เจเฉเจคเจพเฅค
เจฎเฉเจ C# .Net 'เจคเฉ เจฒเฉเจเจพเจ เจ เจคเฉ เจฆเจธเจคเจพเจตเฉเจเจผเจพเจ เจจเฉเฉฐ เจฆเฉเจ เจเฉ เจ เจงเจฟเจเจจ เจเจฐเจจเจพ เจธเจผเฉเจฐเฉ เจเฉเจคเจพเฅค เจเฉฑเจฅเฉ เจฎเฉเจจเฉเฉฐ เจเฉฐเจฎ เจจเฉเฉฐ เจชเฉเจฐเจพ เจเจฐเจจ เจฆเฉ เจเจ เจคเจฐเฉเจเฉ เจฎเจฟเจฒเฉเฅค ASP.Net เจเจพเจ Azure เจธเฉเจตเจพเจตเจพเจ เจตเจฐเจเฉ เจธเฉฐเจชเฉเจฐเจจ เจนเฉฑเจฒเจพเจ เจคเฉเจ เจฒเฉ เจเฉ, TcpHttp เจเจจเฉเจเจธเจผเจจเจพเจ เจจเจพเจฒ เจธเจฟเฉฑเจงเฉ เจเฉฑเจฒเจฌเจพเจค เจเจฐเจจ เจฒเจ, เจจเฉเฉฑเจเจตเจฐเจ เจจเจพเจฒ เจเฉฐเจเจฐเฉเจเจ เจเจฐเจจ เจฒเจ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจตเจฟเจงเฉเจเจ เจนเจจเฅค
ASP เจจเจพเจฒ เจฎเฉเจฐเฉ เจชเจนเจฟเจฒเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ, เจฎเฉเจ เจเจธเจจเฉเฉฐ เจคเฉเจฐเฉฐเจค เจฐเฉฑเจฆ เจเจฐ เจฆเจฟเฉฑเจคเจพ; เจฎเฉเจฐเฉ เจฐเจพเจ เจตเจฟเฉฑเจ, เจเจน เจธเจพเจกเฉ เจธเฉเจตเจพ เจฒเจ เจฌเจนเฉเจค เจฎเฉเจธเจผเจเจฒ เจซเฉเจธเจฒเจพ เจธเฉเฅค เจ
เจธเฉเจ เจเจธ เจชเจฒเฉเจเจซเจพเจฐเจฎ เจฆเฉเจเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเจพ เจคเฉเจเจพ เจนเจฟเฉฑเจธเจพ เจตเฉ เจจเจนเฉเจ เจตเจฐเจคเจพเจเจเฉ, เจเจธ เจฒเจ เจฎเฉเจ เจเจชเจฃเฉ เจเฉเจ เจเจพเจฐเฉ เจฐเฉฑเจเฉเฅค เจเฉเจฃ TCP เจ
เจคเฉ Http เจเจฒเจพเจเฉฐเจ-เจธเจฐเจตเจฐ เจตเจฟเจเจเจพเจฐ เจธเฉเฅค เจเฉฑเจฅเฉ, Habrรฉ 'เจคเฉ, เจฎเฉเจจเฉเฉฐ เจฌเจพเจฐเฉ เจเฉฑเจ เจฒเฉเจ เจญเจฐ เจตเจฟเฉฑเจ เจเจเจ เจธเฉ
เจธเจฐเจตเจฐ เจฆเฉ เจชเจนเจฟเจฒเฉ เจธเฉฐเจธเจเจฐเจฃ เจตเจฟเฉฑเจ เจเจจเฉเจเจธเจผเจจ เจชเฉเจฐเฉเจธเฉเจธเจฟเฉฐเจ, เจธเจฅเจฟเจฐ เจตเฉเจฌ เจชเฉเจ เจฆเฉ เจธเจฎเจเจฐเฉ เจฆเฉ เจธเฉเจตเจพ, เจ เจคเฉ เจเฉฑเจ เจเจชเจญเฉเจเจคเจพ เจกเฉเจเจพเจฌเฉเจธ เจธเจผเจพเจฎเจฒ เจธเฉเฅค เจ เจคเฉ เจธเจผเฉเจฐเฉ เจเจฐเจจ เจฒเจ, เจฎเฉเจ เจธเจพเจเจ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ เจเจพเจฐเจเจเฉเจธเจผเจฒเจคเจพ เจฌเจฃเจพเจเจฃ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ, เจคเจพเจ เจเฉ เจฎเฉเจ เจฌเจพเจ เจฆ เจตเจฟเฉฑเจ เจเจเจกเจฐเฉเจเจก เจ เจคเฉ เจเจเจเจเจธ 'เจคเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจจเฉเฉฐ เจเฉเฉ เจธเจเจพเจเฅค
เจเฉฑเจฅเฉ เจเฉเจ เจเฉเจก เจนเฉ
เจเฉฑเจ เจฌเฉเจ
เฉฐเจค เจฒเฉเจช เจตเจฟเฉฑเจ เจเจพเจนเจเจพเจ เจจเฉเฉฐ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจตเจพเจฒเจพ เจฎเฉเฉฑเจ เจฅเฉเจฐเฉเจก:
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);
}
}
}
เจชเจฐ เจเจฟเจเจเจเจฟ เจธเจฐเจตเจฐ เจธเจฟเจฐเจซเจผ เจเฉฑเจ TCP เจเฉเจจเฉเจเจธเจผเจจ 'เจคเฉ เจเฉฑเจฒเจฆเจพ เจนเฉ, เจเจธ เจฒเจ เจเฉฑเจ เจฎเฉเจกเฉเจเจฒ เจฌเจฃเจพเจเจฃเจพ เจเจผเจฐเฉเจฐเฉ เจนเฉ เจเฉ เจฌเฉเจจเจคเฉ เจฆเฉ เจธเฉฐเจฆเจฐเจญ เจจเฉเฉฐ เจชเจเจพเจฃ เจธเจเฉเฅค เจฎเฉเจ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ เจเจฟ เจเฉฑเจฅเฉ เจเฉฑเจ เจชเจพเจฐเจธเจฐ เจขเฉเจเจตเจพเจ เจนเฉเจตเฉเจเจพ เจเฉ เจเจฒเจพเจเฉฐเจ เจฆเฉ เจฌเฉเจจเจคเฉ เจจเฉเฉฐ เจตเฉฑเจเจฐเฉ เจนเจฟเฉฑเจธเจฟเจเจ เจตเจฟเฉฑเจ เจตเฉฐเจก เจฆเฉเจตเฉเจเจพ เจเจฟเจธ เจจเจพเจฒ เจฎเฉเจ เจเจฒเจพเจเฉฐเจ เจจเฉเฉฐ เจฒเฉเฉเฉเจเจฆเฉ เจเจตเจพเจฌ เจฆเฉเจฃ เจฒเจ เจเฉฑเจฒเจฌเจพเจค เจเจฐ เจธเจเจฆเจพ เจนเจพเจเฅคเจชเจพเจฐเจธเจฐ
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 เจซเจพเจฐเจฎ เจฆเฉ เจเฉฑเจ เจเจฐเฉ เจตเจฟเฉฑเจ เจชเจพเจเจเจฆเฉ เจนเจพเจ, เจ เจคเฉ เจ เจธเฉเจ เจเจน เจตเฉ เจฒเฉฑเจญเจฆเฉ เจนเจพเจ, เจเฉเจเจฐ เจเฉเจ เจนเฉเจตเฉ, เจธเจฎเฉฑเจเจฐเฉ (เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจชเฉเฉฑเจเจเจฟเฉฑเจ) เจเฉ เจ เจธเฉเจ เจเฉฑเจ เจธเจฎเจพเจจ เจเจฐเฉ เจตเจฟเฉฑเจ เจชเจพเจเจเจฆเฉ เจนเจพเจเฅค เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจชเจพเจฐเจธเจฐ เจเจน เจชเจคเจพ เจฒเจเจพเจเจเจฆเจพ เจนเฉ เจเจฟ เจเฉ เจฎเฉเจเฉเจฆเจพ เจเจฒเจพเจเฉฐเจ เจ เจงเจฟเจเจพเจฐเจค เจนเฉ เจ เจคเฉ เจเจธเจฆเจพ เจกเฉเจเจพ เจธเจเฉเจฐ เจเจฐเจฆเจพ เจนเฉเฅค เจ เจงเจฟเจเจพเจฐเจค เจเจพเจนเจเจพเจ เจฆเฉเจเจ เจธเจพเจฐเฉเจเจ เจฌเฉเจจเจคเฉเจเจ เจตเจฟเฉฑเจ เจเฉฑเจ เจชเฉเจฐเจฎเจพเจฃเฉเจเจฐเจจ เจนเฉเจธเจผ เจนเฉเฉฐเจฆเจพ เจนเฉ, เจเฉ เจเจฟ เจเฉเจเฉเจเจผ เจตเจฟเฉฑเจ เจธเจเฉเจฐ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ, เจเจธเจฆเจพ เจงเฉฐเจจเจตเจพเจฆ เจฆเฉ เจเจฟเจธเจฎเจพเจ เจฆเฉ เจเจพเจนเจเจพเจ เจฒเจ เจนเฉเจฐ เจเจชเจฐเฉเจเจฟเฉฐเจ เจคเจฐเจ เจจเฉเฉฐ เจตเฉฑเจ เจเจฐเจจเจพ เจ เจคเฉ เจเจนเจจเจพเจ เจจเฉเฉฐ เจธเจนเฉ เจเจตเจพเจฌ เจฆเฉเจฃเจพ เจธเฉฐเจญเจต เจนเฉเฅคเจเฉเจฐ, เจเฉฑเจ เจเฉเจเฉ, เจตเจงเฉเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพ เจเฉ เจเฉฑเจ เจตเฉฑเจเจฐเฉ เจฎเฉเจกเฉเจเจฒ เจตเจฟเฉฑเจ เจชเจพเจเจฃ เจฆเฉ เจฏเฉเจ เจนเฉเจตเฉเจเฉ, "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":
returnquot;{Header} text/html";
case ".css":
returnquot;{Header} text/css";
case ".js":
returnquot;{Header} text/javascript";
case ".jpg":
case ".jpeg":
case ".png":
case ".gif":
returnquot;{Header} image/{extension}";
default:
if (extension.Length > 1)
{
returnquot;{Header} application/" + extension.Substring(1);
}
else
{
returnquot;{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 เจนเฉ เจเจฟเจ เจนเฉเฅค เจ เจคเฉ เจฎเฉเจ เจธเจฟเจฐเจซ เจธเจนเฉ เจซเฉเจธเจฒเฉ 'เจคเฉ เจเจเจ เจนเจพเจ.
Tcp 'เจคเฉ เจฎเฉเจเฉเจฆเจพ เจธเจฐเจตเจฐ เจฒเจพเจเฉเจเจฐเจจ เจจเฉเฉฐ เจฌเจพเจนเจฐ เจธเฉเฉฑเจเฉ เจ เจคเฉ Http เจฆเฉ เจ เจงเฉเจจ เจนเจฐ เจเฉเจเจผ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจเฉเฅค เจนเฉเจฃ เจชเฉเจฐเฉเจเฉเจเจ เจฐเฉเจกเจฟเจเจผเจพเจเจจ เจชเฉเจพเจ เจตเจฟเฉฑเจ เจนเฉ, เจชเจฐ เจชเจฐเจธเจชเจฐ เจชเฉเจฐเจญเจพเจต เจฆเฉ เจฌเจฟเจฒเจเฉเจฒ เจตเฉฑเจเจฐเฉ เจธเจฟเจงเจพเจเจคเจพเจ เจฆเฉ เจ เจจเฉเจธเจพเจฐ. เจกเจฟเจตเจพเจเจธเจพเจ เจ เจคเฉ เจธเจพเจเจ เจฆเจพ เจธเฉฐเจเจพเจฒเจจ เจธเจฎเจเจพเจฒเฉ เจ เจคเฉ เจกเฉเจฌเฉฑเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจ เจคเฉ เจเจธเจฆเจพ เจเฉฑเจ เจเจฎ เจธเฉฐเจเจฒเจช เจนเฉ, เจธเจฟเจฐเจซ เจซเจฐเจ เจเจน เจนเฉ เจเจฟ เจกเจฟเจตเจพเจเจธเจพเจ เจฒเจ HTML เจชเฉฐเจจเฉ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเฉเจ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉเฅค
เจธเจฟเฉฑเจเจพ
"เจเฉ เจคเฉเจธเฉเจ เจซเฉเจฐเจก เจจเฉเฉฐ เจจเจนเฉเจ เจเจพเจฃเจฆเฉ, เจคเจพเจ เจชเจพเจฃเฉ เจตเจฟเฉฑเจ เจจเจพ เจเจพเจ" เจฎเฉเจ เจธเฉเจเจฆเจพ เจนเจพเจ เจเจฟ เจเฉฐเจฎ เจธเจผเฉเจฐเฉ เจเจฐเจจ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจฎเฉเจฐเฉ เจเฉเจฒ เจตเจงเฉเจฐเฉ เจธเจชเจธเจผเจ เจคเฉเจฐ 'เจคเฉ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเฉเจเจฟเจเจ เจ เจคเฉ เจเจฆเฉเจธเจผเจพเจ เจฆเฉ เจจเจพเจฒ-เจจเจพเจฒ เจตเฉฑเจ-เจตเฉฑเจ เจเจพเจนเจเจพเจ 'เจคเฉ เจเจนเจจเจพเจ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจ เจฒเจ เจฒเฉเฉเฉเจเจฆเฉเจเจ เจคเจเจจเจพเจฒเฉเจเฉเจเจ เจ เจคเฉ เจคเจฐเฉเจเจฟเจเจ เจฆเจพ เจ เจงเจฟเจเจจ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค เจชเฉเจฐเฉเจเฉเจเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจชเฉเจฐเจพ เจนเฉเจฃ เจฆเฉ เจจเฉเฉเฉ เจนเฉ, เจชเจฐ เจนเฉ เจธเจเจฆเจพ เจนเฉ เจเจฟ เจฎเฉเจ เจเจธ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเจจ เจฒเจ เจตเจพเจชเจธ เจเจตเจพเจเจเจพ เจเจฟ เจฎเฉเจ เจเฉเจ เจเฉเจเจผเจพเจ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจเจฟเจตเฉเจ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเฉเจคเจพเฅค เจฎเฉเจ เจตเจฟเจเจพเจธ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจฆเฉเจฐเจพเจจ เจฌเจนเฉเจค เจเฉเจ เจธเจฟเฉฑเจเจฟเจ เจนเฉ, เจชเจฐ เจญเจตเจฟเฉฑเจ เจตเจฟเฉฑเจ เจธเจฟเฉฑเจเจฃ เจฒเจ เจนเฉเจฐ เจตเฉ เจฌเจนเฉเจค เจเฉเจ เจนเฉเฅค เจเฉเจเจฐ เจคเฉเจธเฉเจ เจเจธ เจจเฉเฉฐ เจนเฉเจฃ เจคเฉฑเจ เจชเฉเฉเจน เจฒเจฟเจ เจนเฉ, เจคเจพเจ เจ เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ เจคเฉเจนเจพเจกเจพ เจงเฉฐเจจเจตเจพเจฆเฅค
เจธเจฐเฉเจค: www.habr.com