58 lines
1.7 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
} |