Пример #1
0
        internal void Start()
        {
            int origin = Interlocked.CompareExchange(ref _state, _connecting, _none);

            if (origin == _disposed)
            {
                throw new ObjectDisposedException("This tcp socket session has been disposed when connecting.");
            }
            else if (origin != _none)
            {
                throw new InvalidOperationException("This tcp socket session is in invalid state when connecting.");
            }

            try
            {
                _stream = NegotiateStream(_tcpClient.GetStream());

                if (_receiveBuffer == default(ArraySegment <byte>))
                {
                    _receiveBuffer = _bufferManager.BorrowBuffer();
                }

                _receiveBufferOffset = 0;

                if (Interlocked.CompareExchange(ref _state, _connected, _connecting) != _connecting)
                {
                    Close(false); // connecting with wrong state
                    throw new ObjectDisposedException("This tcp socket session has been disposed after connected.");
                }

                bool isErrorOccurredInUserSide = false;
                try
                {
                    _server.RaiseClientConnected(this);
                }
                catch (Exception ex) // catch all exceptions from out-side
                {
                    isErrorOccurredInUserSide = true;
                    HandleUserSideError(ex);
                }

                if (!isErrorOccurredInUserSide)
                {
                    ContinueReadBuffer();
                }
                else
                {
                    Close(true); // user side handle tcp connection error occurred
                }
            }
            catch (Exception ex) // catch exceptions then log then re-throw
            {
                _log.Error(ex);
                Close(true); // handle tcp connection error occurred
                throw;
            }
        }
Пример #2
0
        internal void Start()
        {
            lock (_opsLock)
            {
                try
                {
                    if (Active)
                    {
                        _closed = false;

                        _stream = NegotiateStream(_tcpClient.GetStream());

                        _receiveBuffer      = _bufferManager.BorrowBuffer();
                        _sessionBuffer      = _bufferManager.BorrowBuffer();
                        _sessionBufferCount = 0;

                        bool isErrorOccurredInUserSide = false;
                        try
                        {
                            _server.RaiseClientConnected(this);
                        }
                        catch (Exception ex)
                        {
                            isErrorOccurredInUserSide = true;
                            HandleUserSideError(ex);
                        }

                        if (!isErrorOccurredInUserSide)
                        {
                            ContinueReadBuffer();
                        }
                        else
                        {
                            Close();
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.Error(ex.Message, ex);
                    Close();
                }
            }
        }