/// <summary> /// Listens for client connections /// </summary> private static void ListenForClients(object currentServer) { NamedPipesServer server = (NamedPipesServer)currentServer; try { while (server.Running) { SafeFileHandle clientHandle = CreateNamedPipe( server.PipeName, (uint)server.PipeType, 0, 255, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero); //could not create named pipe if (clientHandle.IsInvalid) { throw new InvalidOperationException("Unable to create pipe"); } int success = ConnectNamedPipe(clientHandle, IntPtr.Zero); //could not connect client if (success == 0) { throw new InvalidOperationException("Unable to connect pipe to client"); } Client client = new Client(); client.handle = clientHandle; client.server = server; lock (server._clients) { server._clients.Add(client); } Thread readThread = new Thread(new ParameterizedThreadStart(ClientPollingThread)); readThread.IsBackground = true; readThread.Name = "Named pipe client thread"; readThread.Start(client); } } finally { server.Running = false; } }
public NamedPipesEngineCommunication() { _instanceIdentifier = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); _readServer = new NamedPipesServer(@"\\.\pipe\AGSEditorDebuggerGameToEd" + _instanceIdentifier.ToString(), NamedPipeType.Read); _writeServer = new NamedPipesServer(@"\\.\pipe\AGSEditorDebuggerEdToGame" + _instanceIdentifier.ToString(), NamedPipeType.Write); _readServer.MessageReceived += new NamedPipesServer.MessageReceivedHandler(_server_MessageReceived); _readServer.Start(); _writeServer.Start(); _messageSender = new Thread(new ThreadStart(MessageSenderThread)); _messageSender.Name = "MessageSender thread"; _messageSender.Start(); }
private void _server_MessageReceived(NamedPipesServer.Client client, string message) { if (message == "MSGACK") { _expectingAck = false; return; } // We use a separate thread to send the messages to avoid deadlocks // waiting to get the MSGACK _messageQueue.Enqueue(message); }