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); }
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; }); }