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; } }
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(); } } }