using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace Core { public class PServer { private Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); public PServer(string ip, int port, int backlog) { IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ip), port); serverSocket.Bind(endPoint); serverSocket.Listen(backlog); } public async Task StartAsync() { while (true) { Socket clientSocket = await serverSocket.AcceptAsync(); Console.WriteLine($"[{DateTime.Now}] Accept client: {clientSocket.RemoteEndPoint}"); ThreadPool.QueueUserWorkItem(RunAsync, clientSocket); } } private async void RunAsync(object? sender) { if (sender == null) return; Socket clientSocket = (Socket)sender; byte[] headerBuffer = new byte[2]; while (true) { // header buffer int n1 = await clientSocket.ReceiveAsync(headerBuffer, SocketFlags.None); if (n1 < 1) { Console.WriteLine($"[{DateTime.Now}] Disconnect client: {clientSocket.RemoteEndPoint}"); clientSocket.Dispose(); return; } else if (n1 == 1) { await clientSocket.ReceiveAsync(new ArraySegment(headerBuffer, 1, 1), SocketFlags.None); } // data buffer short dataSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(headerBuffer)); byte[] dataBuffer = new byte[dataSize]; int totalRecv = 0; while (totalRecv < dataSize) { int n2 = await clientSocket.ReceiveAsync(new ArraySegment(dataBuffer, totalRecv, dataSize - totalRecv), SocketFlags.None); totalRecv += n2; } Console.WriteLine($"[{DateTime.Now}] {clientSocket.RemoteEndPoint} client: {Encoding.UTF8.GetString(dataBuffer)}"); } } } }