internal void SendMessage(IpmMessage message) { var buffer = message.ToByteArray(); lock (_internalLock) { PipeServer.Write(buffer, 0, buffer.Length); } }
private async Task ListenAsync(CancellationToken ct) { await PipeServer.WaitForConnectionAsync(ct); Console.WriteLine("w3wp connected"); while (true) { try { var buffer = new byte[IpmMessage.MessageHeaderSize]; if (await PipeServer.ReadAsync(buffer, 0, IpmMessage.MessageHeaderSize, ct) != IpmMessage.MessageHeaderSize) { // TODO better exceptions throw new ApplicationException(); } var messageHeader = new IpmMessage(buffer); var messageBodyBuffer = new byte[messageHeader.MessageBodySize]; if (await PipeServer.ReadAsync(messageBodyBuffer, 0, (int)messageHeader.MessageBodySize, ct) != messageHeader.MessageBodySize) { // TODO better exceptions throw new ApplicationException(); } // Dispatch based on the message received switch (messageHeader.OpCode) { case IPM_OPCODE.IPM_OP_GETPID: var pidMessage = new GetPidMessage(messageHeader, messageBodyBuffer); Console.WriteLine($"w3wp[{pidMessage.ProcessId}] connected"); break; default: // For now we're just ignoring the message Console.WriteLine(Enum.GetName(typeof(IPM_OPCODE), messageHeader.OpCode)); Console.WriteLine(messageHeader.MessageBodySize); PipeServer.Position += (messageHeader.MessageBodySize); break; } } catch (AggregateException e) { Console.WriteLine(e.InnerException.Message); Console.WriteLine("Aborting listener thread"); break; } if (ct.IsCancellationRequested) { break; } } }
internal void SendMessage(IpmMessage message) { if (!_pipeServerStream.CanWrite) { throw new ApplicationException(); } var buffer = message.ToByteArray(); lock (_lock) { _pipeServerStream.Write(buffer, 0, buffer.Length); } _logger.LogInformation("Ping message sent"); }