namespace Serveur { class ServeurStopPCTcp : ServeurTcp, IServeurImpl { private const int WM_USER = 0x0400; public bool ArretPoste() { Process.Start("shutdown","/s /t 0"); return true; } protected override Action Pooling { get { return AsyncClient.Connection; } } private static class AsyncClient { public static void Connection(object obj) { Tuple data = (Tuple)obj; TcpClient client = data.Item1; IServeurImpl serveur = data.Item2; NetworkStream stream = client.GetStream(); AsyncCallback callback = new AsyncCallback(DonneesRecues); byte[] bytes = new byte[1500]; stream.BeginRead(bytes, 0, bytes.Length, DonneesRecues, new Tuple(stream, bytes, serveur)); } private static void DonneesRecues(IAsyncResult ar) { Tuple data = (Tuple)ar.AsyncState; NetworkStream stream = data.Item1; int nbOctets = stream.EndRead(ar); byte[] bytes = data.Item2; string commande = Encoding.ASCII.GetString(bytes, 0, nbOctets); IServeurImpl serveur = data.Item3; if (commande == "ArretPoste") { if (serveur.ArretPoste()) bytes = Encoding.ASCII.GetBytes("OK"); else bytes = Encoding.ASCII.GetBytes("NOK"); stream.Write(bytes, 0, bytes.Length); stream.Close(); serveur.StopListening(); } else { // On lance l'acquisition du paquet suivant. stream.BeginRead(bytes, 0, bytes.Length, DonneesRecues, new Tuple(stream, bytes, serveur)); } } } } }