コード例 #1
0
        internal void SendMessage(IpmMessage message)
        {
            var buffer = message.ToByteArray();

            lock (_internalLock)
            {
                PipeServer.Write(buffer, 0, buffer.Length);
            }
        }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
        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");
        }