public byte[] Receive(int maxLength = int.MaxValue, SocketFlags socketFlags = SocketFlags.None) { var bufferLength = Math.Min(Socket.Available, maxLength); var buffer = new byte[bufferLength]; if (bufferLength > 0) { Socket.Receive(buffer, socketFlags); } if (!socketFlags.HasFlag(SocketFlags.Peek)) { _expectedBytesInReceiveBuffer -= bufferLength; _indexOfNextMessageToReceive -= bufferLength; if (_indexOfNextMessageToReceive < 0) { _indexOfNextMessageToReceive = 0; } } Helpers.DebugInfo("#{0}: Received {1} bytes from raw queue. Queue is now {2} bytes.", Id, buffer.Length, Socket.Available); return(buffer); }
protected async Task <int> ReceiveAsync(byte[] buffer, int offset, int size, SocketFlags socketFlags) { if (!IsConnected) { return(-1); } if (buffer == null) { throw new NullReferenceException("Buffer cannot be null."); } else if (buffer.Length == 0 || size == 0) { return(0); } int read = -1; try { IAsyncResult result = Client.BeginReceive(buffer, offset, size, socketFlags, null, null); read = await Task.Factory.FromAsync(result, Client.EndReceive).ConfigureAwait(false); } catch { read = -1; } if (read > 0 && IsDecrypting && Decrypter != null) { Decrypter.RefParse(buffer, offset, read, socketFlags.HasFlag(SocketFlags.Peek)); } return(read); }
public static IObservable <ByteBuffer> ToClientObservable(this Socket socket, int size, SocketFlags socketFlags, Selector selector) { return(Observable.Create <ByteBuffer>(observer => { var buffer = new byte[size]; var selectMode = socketFlags.HasFlag(SocketFlags.OutOfBand) ? SelectMode.SelectError : SelectMode.SelectRead; selector.AddCallback(selectMode, socket, _ => { try { var bytes = socket.Receive(buffer, 0, size, socketFlags); if (bytes == 0) { observer.OnCompleted(); } else { observer.OnNext(new ByteBuffer(buffer, bytes)); } } catch (Exception error) { if (error.IsWouldBlock()) { return; } observer.OnError(error); } }); return Disposable.Create(() => selector.RemoveCallback(SelectMode.SelectRead, socket)); })); }
public static IObservable <DisposableValue <ArraySegment <byte> > > ToFrameClientObservable(this Socket socket, SocketFlags socketFlags, BufferManager bufferManager, Selector selector) { return(Observable.Create <DisposableValue <ArraySegment <byte> > >(observer => { var headerState = new BufferState(new byte[sizeof(int)], 0, sizeof(int)); var contentState = new BufferState(null, 0, -1); var selectMode = socketFlags.HasFlag(SocketFlags.OutOfBand) ? SelectMode.SelectError : SelectMode.SelectRead; selector.AddCallback(selectMode, socket, _ => { try { if (headerState.Length > 0) { headerState.Advance(socket.Receive(headerState.Bytes, headerState.Offset, headerState.Length, socketFlags)); if (headerState.Length == 0) { contentState.Length = BitConverter.ToInt32(headerState.Bytes, 0); contentState.Offset = 0; contentState.Bytes = bufferManager.TakeBuffer(contentState.Length); } } if (contentState.Bytes != null) { contentState.Advance(socket.Receive(contentState.Bytes, contentState.Offset, contentState.Length, socketFlags)); if (contentState.Length == 0) { var managedBuffer = contentState.Bytes; var length = contentState.Offset; observer.OnNext(DisposableValue.Create(new ArraySegment <byte>(managedBuffer, 0, length), Disposable.Create(() => bufferManager.ReturnBuffer(managedBuffer)))); contentState.Bytes = null; headerState.Length = headerState.Offset; headerState.Offset = 0; } } } catch (Exception exception) { if (!exception.IsWouldBlock()) { observer.OnError(exception); } } }); return Disposable.Create(() => selector.RemoveCallback(SelectMode.SelectRead, socket)); })); }
protected async Task <int> ReceiveAsync(byte[] buffer, int offset, int size, SocketFlags socketFlags) { if (!IsConnected) { return(0); } IAsyncResult result = Client.BeginReceive(buffer, offset, size, socketFlags, null, null); int read = await Task.Factory.FromAsync(result, Client.EndReceive).ConfigureAwait(false); if (read > 0 && IsDecrypting && Decrypter != null) { Decrypter.RefParse(buffer, offset, read, socketFlags.HasFlag(SocketFlags.Peek)); } return(read); }
protected int Receive(byte[] buffer, int offset, int size, SocketFlags socketFlags) { if (!IsConnected) { return(0); } try { int read = Client.Receive(buffer, offset, size, socketFlags); if (read > 0 && IsDecrypting && Decrypter != null) { Decrypter.RefParse(buffer, offset, read, socketFlags.HasFlag(SocketFlags.Peek)); } return(read); } catch { return(0); } }
public static IObservable<DisposableByteBuffer> ToFrameClientObservable(this Socket socket, SocketFlags socketFlags, BufferManager bufferManager, Selector selector) { return Observable.Create<DisposableByteBuffer>(observer => { var headerState = new BufferState(new byte[sizeof(int)], 0, sizeof(int)); var contentState = new BufferState(null, 0, -1); var selectMode = socketFlags.HasFlag(SocketFlags.OutOfBand) ? SelectMode.SelectError : SelectMode.SelectRead; selector.AddCallback(selectMode, socket, _ => { try { if (headerState.Length > 0) { headerState.Advance(socket.Receive(headerState.Bytes, headerState.Offset, headerState.Length, socketFlags)); if (headerState.Length == 0) { contentState.Length = BitConverter.ToInt32(headerState.Bytes, 0); contentState.Offset = 0; contentState.Bytes = bufferManager.TakeBuffer(contentState.Length); } } if (contentState.Bytes != null) { contentState.Advance(socket.Receive(contentState.Bytes, contentState.Offset, contentState.Length, socketFlags)); if (contentState.Length == 0) { var managedBuffer = contentState.Bytes; var length = contentState.Offset; observer.OnNext(new DisposableByteBuffer(managedBuffer, length, Disposable.Create(() => bufferManager.ReturnBuffer(managedBuffer)))); contentState.Bytes = null; headerState.Length = headerState.Offset; headerState.Offset = 0; } } } catch (Exception exception) { if (!exception.IsWouldBlock()) observer.OnError(exception); } }); return Disposable.Create(() => selector.RemoveCallback(SelectMode.SelectRead, socket)); }); }