using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Threading; using MafiaCommon.Packets; namespace MafiaServer { public class Server { private readonly Socket _socket; private readonly Thread _acceptor; private readonly List _clientSockets = new(); private readonly List _clientThreads = new(); public Server() { _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _socket.Bind(new IPEndPoint(IPAddress.Any, Settings.Config().Port)); _socket.Listen(10); _acceptor = new Thread(Acceptor) {IsBackground = true}; _acceptor.Start(); Console.WriteLine("Server started!"); } public void Stop(string reason) { _acceptor.Interrupt(); foreach (var thread in _clientThreads) { thread.Interrupt(); } foreach (var socket in _clientSockets) { if (socket.Connected) { socket.Send(PacketConverter.ToBytes(new ServerShutdownPacket(reason))); } } } private void Acceptor() { while (true) { var playerSocket = _socket.Accept(); var playerSocketWorker = new PlayerSocketWorker(playerSocket); var thread = new Thread(playerSocketWorker.Run); _clientSockets.Add(playerSocket); _clientThreads.Add(thread); thread.Start(); } } } }