1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Terminal;
using Terminal.config;
using informations.Packets;
using System.Threading;
namespace informations.Network
{
public class SocketManager
{
public static readonly Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static readonly List<Socket> clientSockets = new List<Socket>();
private const int BUFFER_SIZE = 2048;
private static readonly byte[] buffer = new byte[BUFFER_SIZE];
public static void SetupServer()
{
IPHostEntry ipHostEntry = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostEntry.AddressList[0];
ConsoleUtils.Write(ConsoleUtils.Type.DEBUG, $"Serveur lancé sur l'IP: {ipAddress}:{Config.LoginServerPort} ");
serverSocket.Bind(new IPEndPoint(ipAddress, Config.LoginServerPort));
serverSocket.Listen(0);
serverSocket.BeginAccept(AcceptCallback, null);
}
private static void CloseAllSockets()
{
foreach (Socket socket in clientSockets)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
serverSocket.Close();
}
private static void AcceptCallback(IAsyncResult AR)
{
Socket socket;
try
{
socket = serverSocket.EndAccept(AR);
}
catch (ObjectDisposedException)
{
return;
}
clientSockets.Add(socket);
socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket);
serverSocket.BeginAccept(AcceptCallback, null);
}
private static void ReceiveCallback(IAsyncResult AR)
{
Socket current = (Socket)AR.AsyncState;
int received;
try
{
received = current.EndReceive(AR);
}
catch (SocketException)
{
ConsoleUtils.Write(ConsoleUtils.Type.ERROR,"Connexion interrompue");
return;
}
byte[] recBuf = new byte[received];
Array.Copy(buffer, recBuf, received);
string text = Encoding.ASCII.GetString(recBuf);
ConsoleUtils.Write(ConsoleUtils.Type.RECEIV, text);
if(text.Contains(PacketEnums.RequêteClient))
{
string s = text.Split('|')[1];
UpChat up = new UpChat();
up.Connect_client(s);
}
if (text.ToLower() == "aide")
{
string aide = "Liste des commandes: " + Environment.NewLine +
"- aide - Aide generale" + Environment.NewLine +
"- heure - Horloge du serveur" + Environment.NewLine +
"- clore - Fermer le panel";
byte[] data = Encoding.ASCII.GetBytes(aide);
current.Send(data);
ConsoleUtils.Write(ConsoleUtils.Type.SEND, $"Commande envoyée au client");
}
else if (text.ToLower() == "clore")
{
current.Shutdown(SocketShutdown.Both);
current.Close();
clientSockets.Remove(current);
ConsoleUtils.Write(ConsoleUtils.Type.INFO, "Client déconnecté");
return;
}
else
{
ConsoleUtils.Write(ConsoleUtils.Type.WARNING, $"Packet {text} inconnu");
}
current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
}
}
} |