RMafia/MafiaServer/Server.cs
2021-04-28 23:50:55 +03:00

58 lines
1.7 KiB
C#

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<Socket> _clientSockets = new();
private readonly List<Thread> _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();
}
}
}
}