using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace Lab20ServerMultiThread { class Program { public static void Main(string[] args) { TcpListener server = null; try { // Threading.. int maxThreadCount = Environment.ProcessorCount * 4; ThreadPool.SetMaxThreads(maxThreadCount, maxThreadCount); ThreadPool.SetMinThreads(2, 2); // Server creation int port = 9999; int counter = 0; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); server = new TcpListener(localAddr, port); server.Start(); Console.WriteLine($"Server started on 127.0.0.1:{port}. Thread count: {maxThreadCount}"); // Listining for clients while (true) { Console.WriteLine("Waiting for connection..."); ThreadPool.QueueUserWorkItem(ClientProcessing, server.AcceptTcpClient()); Console.WriteLine($"Accepted connection #{counter}"); counter++; } } catch (SocketException exc) { Console.WriteLine($"Socket exception: {exc}"); } finally { server.Stop(); } } /// /// Processes accepted client /// /// State. private static void ClientProcessing(object state) { byte[] bytes = new byte[256]; string data = null; TcpClient tcpClient = state as TcpClient; // Get incoming info NetworkStream stream = tcpClient.GetStream(); int i; while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { data = Encoding.ASCII.GetString(bytes, 0, i).ToUpper(); // Echo uppered info byte[] msg = Encoding.ASCII.GetBytes(data); stream.Write(msg, 0, msg.Length); } tcpClient.Close(); } } }