Example #1
0
        public Session(IStreamHandler streamHandler, Socket socket, Guid sessionId)
        {
            SessionId = sessionId;
            Socket = socket;
            StreamHandler = streamHandler;

            _outgoingBuffer = new BytesRingBuffer(64 * 1024);
            _receiveEventArgs = new SocketAsyncEventArgs { UserToken = this };
            _sendEventArgs = new SocketAsyncEventArgs { UserToken = this, RemoteEndPoint = socket.RemoteEndPoint };

            _sendObservable = _sendEventArgs.ToObservable();
            _sendSubscription = _sendObservable.SubscribeOn(ThreadPoolScheduler.Instance).Subscribe(OnSendCompleted);

            IObservable<byte[]> dataToSend = Observable.FromEventPattern<byte[]>(this, "OnSendAsync").Select(pattern => pattern.EventArgs);

            dataToSend.Subscribe(data =>
                {
                    if (_outgoingBuffer.FreeBytes >= data.Length)
                    {
                        WriteToSendBuffer(data);
                    }
                    else
                    {
                        _outgoingBuffer.NotifyFreeSpace(data.Length, _freeSpaceHandler);

                        if (!_freeSpaceHandler.WaitOne(5000) && _outgoingBuffer.FreeBytes < data.Length)
                        {
                            //Slow consumer
                            Trace.TraceError("Slow consumer detected. Closing Socket to {0}.", Socket.RemoteEndPoint);
                            Close();
                        }
                        else
                        {
                            WriteToSendBuffer(data);
                        }
                    }
                });
        }