Пример #1
0
        private void OnReceive(object sender, SocketAsyncEventArgs e)
        {
            e.Completed -= OnConnected;

            SocketError errorCode = e.SocketError;

            if (errorCode != SocketError.Success)
            {
                throw new SocketException((Int32)errorCode);
            }

            try
            {
                int byteCount = e.BytesTransferred;

                if (byteCount > 0)
                {
                    byte[] buffer = e.Buffer;

                    try
                    {
                        BeginReceive();
                    }
                    catch (Exception ex)
                    {
                        Tracer.Error(ex);
                        Dispose();
                    }

                    if (_isCompressionEnabled)
                    {
                        byte[] unpackBuffer = _recvBuffer.AcquireBuffer();

                        int unpackSize;
                        int sourceIndex = 0;
                        int sourceSize  = byteCount;

                        while (HuffmanCompression.Decompress(buffer, ref sourceIndex, sourceSize, unpackBuffer, out unpackSize))
                        {
                            lock (_buffer)
                                _buffer.Enqueue(unpackBuffer, 0, unpackSize);

                            _messagePump.OnReceive(this);
                        }

                        _recvBuffer.ReleaseBuffer(buffer);
                        _recvBuffer.ReleaseBuffer(unpackBuffer);
                    }
                    else
                    {
                        lock (_buffer)
                            _buffer.Enqueue(buffer, 0, byteCount);

                        _recvBuffer.ReleaseBuffer(buffer);
                        _messagePump.OnReceive(this);
                    }
                }
                else
                {
                    Dispose();
                }
            }
            catch
            {
                Dispose();
            }
        }