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); }
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); } } }
public DuplexAnonymousPipeServer(AnonymousPipeServerStream sender, AnonymousPipeServerStream receiver, ChannelSettings?settings = null) { channel = new DuplexPipeChannel(sender, receiver, settings); }