public DuplexAnonymousPipeClient(AnonymousPipeClientStream sender, AnonymousPipeClientStream receiver, ChannelSettings?settings = null)
        {
            if (sender == null)
            {
                throw new ArgumentNullException(nameof(sender));
            }
            if (receiver == null)
            {
                throw new ArgumentNullException(nameof(receiver));
            }

            channel = new DuplexPipeChannel(sender, receiver, settings);
        }
Ejemplo n.º 2
0
        private static void Listener(object args)
        {
            DuplexPipeChannel channel = (DuplexPipeChannel)args;

            IBus      bus      = channel.bus;
            Stream    stream   = channel.InStream;
            IHydrator hydrator = channel.settings.Hydrator;

            CancellationTokenSource cts   = channel.thrCancelTokens;
            CancellationToken       token = cts.Token;

            while (!token.IsCancellationRequested)
            {
                object payload;
                using (MemoryStream ms = new MemoryStream())
                {
                    bool final;
                    do
                    {
                        byte[] buffer = new byte[HeaderPacketSize];
                        var    handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
                        try
                        {
                            ReadBytes(buffer, stream);
                            HeaderPacket header =
                                (HeaderPacket)
                                Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(HeaderPacket));
                            final = header.Final;

                            if (token.IsCancellationRequested)
                            {
                                break;
                            }

                            if (header.Size > 0)
                            {
                                byte[] dataBuffer = new byte[header.Size];
                                var    red        = ReadBytes(dataBuffer, stream);
                                ms.Write(dataBuffer, 0, red);
                            }
                        }
                        finally
                        {
                            handle.Free();
                        }
                    } while (!final && !token.IsCancellationRequested);

                    if (ms.Length == 0)
                    {
                        continue;
                    }
                    ms.Seek(0, SeekOrigin.Begin);

                    try
                    {
                        payload = hydrator.Hydrate(ms);
                    }
                    catch
                    {
                        payload = null;
                    }
                }

                if (payload != null)
                {
                    bus.Publish(payload);
                }
            }
        }
Ejemplo n.º 3
0
 public DuplexAnonymousPipeServer(AnonymousPipeServerStream sender, AnonymousPipeServerStream receiver, ChannelSettings?settings = null)
 {
     channel = new DuplexPipeChannel(sender, receiver, settings);
 }