using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Threading; using MafiaCommon.Packets; using Newtonsoft.Json; namespace MafiaServer { public class Server { private Socket _socket; private Thread _acceptor; private List _clientSockets = new List(); private List _clientThreads = new List(); 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(new ThreadStart(acceptor)); _acceptor.IsBackground = true; _acceptor.Start(); Console.WriteLine("Server started!"); } public void stop(String reason) { _acceptor.Interrupt(); foreach (Thread thread in _clientThreads) { thread.Interrupt(); } foreach (Socket socket in _clientSockets) { if (socket.Connected) { socket.Send(PacketConverter.ToBytes(new ServerShutdownPacket(reason))); } } } private void acceptor() { while (true) { Socket playerSocket = _socket.Accept(); PlayerSocketWorker playerSocketWorker = new PlayerSocketWorker(playerSocket); Thread thread = new Thread(playerSocketWorker.run); _clientSockets.Add(playerSocket); _clientThreads.Add(thread); thread.Start(); } } } }