private static IObservable <Either <Socket, byte[]> > AcceptObservableWithBuffer(this Socket socket, SocketAsyncEventArgs eventArgs) { Contract.Requires(socket != null); Contract.Requires(eventArgs != null); Contract.Ensures(Contract.Result <IObservable <Either <Socket, byte[]> > >() != null); return(socket .AcceptObservable(eventArgs) .Pair( args => args.AcceptSocket, args => { byte[] buffer = args.Buffer; if (buffer.Length > args.BytesTransferred) { var copy = new byte[args.BytesTransferred]; Array.Copy(buffer, copy, args.BytesTransferred); buffer = copy; } return buffer; })); }
public static IObservable <Socket> AcceptObservable(this Socket socket) { Contract.Requires(socket != null); Contract.Ensures(Contract.Result <IObservable <Socket> >() != null); var args = new SocketAsyncEventArgs(); return(socket .AcceptObservable(args) .Select(e => e.AcceptSocket) .Finally(args.Dispose)); }