Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
            }));
        }
Esempio n. 4
0
        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));
            }));
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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));
            });
        }