using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Serveur { class Program { static List _clientlist = new List(); static List _streamlist = new List(); static TcpListener _server = new TcpListener(IPAddress.Any, 3790); static string filename = null; static List _filelist = new List(); static TcpClient _client; static void Main(string[] args) { _server.Start(5); Console.WriteLine("Server OK"); Begin(); Console.ReadLine(); try { foreach (FileStream _file in _filelist) { _file.Close(); } } catch { } } static void Begin() { _server.BeginAcceptSocket(new AsyncCallback(AcceptCallback), _server); } static void AcceptCallback(IAsyncResult AR) { _filelist.Add(new FileStream("initfile", FileMode.OpenOrCreate)); _filelist[_filelist.Count - 1].Close(); try { _client = _server.EndAcceptTcpClient(AR); } catch(SocketException e) { Console.WriteLine("Error " + e); } _clientlist.Add(_client); Console.WriteLine("Client connected"); clientsgestion(_clientlist.Count, _filelist.Count - 1); Thread _thread = new Thread(new ThreadStart(Thread_Start)); _server.BeginAcceptSocket(new AsyncCallback(AcceptCallback), _server); } static void clientsgestion(int clientnumber, int filenumber) { int streamnumber = 0; try { _streamlist.Add(_clientlist[clientnumber - 1].GetStream()); streamnumber = _streamlist.Count; } catch(Exception e) { Console.WriteLine(e); } int i; byte[] _buffer = new byte[4096]; bool firstmessage = true; try { while ((i = _streamlist[_streamlist.Count -1].Read(_buffer, 0, _buffer.Length)) != 0) { string data = Encoding.UTF8.GetString(_buffer, 0, i); if (firstmessage) { filename = createfile(data, filenumber); firstmessage = false; } else if (!command(data, streamnumber, filenumber)) { write(data, filenumber); } } } catch(Exception e) { Console.WriteLine(e); } } static string createfile(string name, int filenumber) { _filelist[filenumber] = File.OpenWrite(name); _filelist[filenumber].Close(); return name; } static bool command(string data, int streamnumber, int filenumber) { if (data.ToLower() == "get messages") { sendmessages(streamnumber, filenumber); return true; } else return false; } static void sendmessages(int streamnumber, int filenumber) { _filelist[filenumber] = File.OpenRead(filename); byte[] _buffer = new byte[4096]; int i; while((i = _filelist[filenumber].Read(_buffer, 0, _buffer.Length)) !=0) { _streamlist[streamnumber-1].Write(_buffer, 0, i); break; } _filelist[filenumber].Close(); _filelist[filenumber] = File.Open(filename, FileMode.Truncate); _filelist[filenumber].Close(); } static void write(string message, int filenumber) { byte[] _buffer = Encoding.UTF8.GetBytes(DateTime.Now.ToString()+": " + message + Environment.NewLine); _filelist[filenumber] = File.Open(filename, FileMode.Append); _filelist[filenumber].Write(_buffer, 0, _buffer.Length); _filelist[filenumber].Close(); } static void Thread_Start() { _server.BeginAcceptSocket(new AsyncCallback(AcceptCallback), _server); } } }