using System.Net; using System.Net.Sockets; using System.Text; namespace Server; internal class Server { private static readonly int BUFFER_SIZE = 256; static void Main(string[] args) { Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 20000); serverSocket.Bind(endPoint); serverSocket.Listen(100); SocketAsyncEventArgs arg = new SocketAsyncEventArgs(); arg.Completed += AcceptCompleted; bool pending = serverSocket.AcceptAsync(arg); if (!pending) AcceptCompleted(serverSocket, arg); while (true) { Thread.Sleep(1000); } } private static void AcceptCompleted(object? sender, SocketAsyncEventArgs e) { if (sender == null || e == null || e.AcceptSocket == null) return; Socket serverSocket = (Socket)sender; Socket clientSocket = e.AcceptSocket; Console.WriteLine(clientSocket.RemoteEndPoint); e.AcceptSocket = null; bool pending = serverSocket.AcceptAsync(e); if (!pending) AcceptCompleted(serverSocket, e); SocketAsyncEventArgs arg = new SocketAsyncEventArgs(); arg.Completed += ReceiveCompleted; byte[] buffer = new byte[BUFFER_SIZE]; arg.SetBuffer(buffer, 0, buffer.Length); bool pending2 = clientSocket.ReceiveAsync(arg); if (!pending2) ReceiveCompleted(clientSocket, arg); } private static void ReceiveCompleted(object? sender, SocketAsyncEventArgs e) { if (sender == null || e == null) return; Socket clientSocket = (Socket)sender; if (e.BytesTransferred < 1) { Console.WriteLine("Client is disconnected..."); clientSocket.Dispose(); e.Dispose(); return; } Console.WriteLine(Encoding.UTF8.GetString(e.Buffer)); byte[] buffer = new byte[BUFFER_SIZE]; e.SetBuffer(buffer, 0, buffer.Length); bool pending = clientSocket.ReceiveAsync(e); if (!pending) ReceiveCompleted(clientSocket, e); } }