コード例 #1
0
        internal void Close(WebSocketCloseReasons reason)
        {
            try
            {
                if (Interlocked.CompareExchange(ref _isClosed, 1, 0) == 1)
                {
                    return;
                }

                ((UInt16)reason).ToBytesBackwards(_closeBuffer.Array, _closeBuffer.Offset);
                WriteInternal(_closeBuffer, 2, true, false, WebSocketFrameOption.ConnectionClose, WebSocketExtensionFlags.None);
                _clientStream.Close();
            }
            catch { }
        }
コード例 #2
0
        internal void Close(WebSocketCloseReasons reason)
        {
            try
            {
                if (Interlocked.CompareExchange(ref _isClosed, 1, 0) == 1)
                {
                    return;
                }

                ((ushort)reason).ToBytesBackwards(_closeBuffer.Array, _closeBuffer.Offset);
                WriteInternal(_closeBuffer, 2, true, false, WebSocketFrameOption.ConnectionClose, WebSocketExtensionFlags.None);
                _clientStream.Close();
            }
            catch (Exception ex)
            {
                Debug.Fail("WebSocketConnectionRfc6455.Close: " + ex.Message);
            }
        }
コード例 #3
0
        internal void Close(WebSocketCloseReasons reason)
        {
            try
            {
                if (Interlocked.CompareExchange(ref _isClosed, 1, 0) == 1)
                {
                    return;
                }

                ((UInt16)reason).ToBytesBackwards(_closeBuffer.Array, _closeBuffer.Offset);
                WriteInternal(_closeBuffer, 2, true, false, WebSocketFrameOption.ConnectionClose, WebSocketExtensionFlags.None);
#if (NET45 || NET451 || NET452 || NET46)
                _clientStream.Close();
#endif
            }
            catch (Exception ex)
            {
                DebugLog.Fail("WebSocketConnectionRfc6455.Close", ex);
            }
        }
コード例 #4
0
        public async Task CloseAsync(WebSocketCloseReasons reason)
        {
            if (Interlocked.CompareExchange(ref this.closeState, CLOSE_STATE_CLOSED, CLOSE_STATE_OPEN) != CLOSE_STATE_OPEN)
            {
                return;
            }

            await this.writeSemaphore.WaitAsync().ConfigureAwait(false);

            try
            {
                ((ushort)reason).ToBytesBackwards(this.closeBuffer.Array, this.closeBuffer.Offset);
                var messageType = (WebSocketMessageType)WebSocketFrameOption.ConnectionClose;
                var closeFrame  = this.PrepareFrame(this.closeBuffer, 2, true, false, messageType, WebSocketExtensionFlags.None);

                await this.SendFrameAsync(closeFrame, Timeout.InfiniteTimeSpan, SendOptions.NoLock | SendOptions.NoErrors | SendOptions.IgnoreClose, CancellationToken.None).ConfigureAwait(false);

                await this.networkConnection.FlushAsync(CancellationToken.None).ConfigureAwait(false);

                await this.networkConnection.CloseAsync().ConfigureAwait(false);
            }
            catch (Exception closeError) when(closeError.Unwrap() is ThreadAbortException == false)
            {
                var closeErrorUnwrap = closeError.Unwrap();

                if (closeErrorUnwrap is IOException || closeErrorUnwrap is OperationCanceledException || closeErrorUnwrap is InvalidOperationException)
                {
                    return; // ignore common IO exceptions while closing connection
                }
                if (this.log.IsDebugEnabled)
                {
                    this.log.Debug($"({this.GetHashCode():X}) An error occurred while closing connection.", closeError.Unwrap());
                }
            }
            finally
            {
                SafeEnd.ReleaseSemaphore(this.writeSemaphore, this.log);
            }
        }
コード例 #5
0
        private void Close(WebSocketCloseReasons reason)
        {
            try
            {
                if (Interlocked.CompareExchange(ref _isClosed,1,0) == 1)
                    return;

                ((Int16)reason).ToBytesBackwards(_closeBuffer.Array, _closeBuffer.Offset);
                WriteInternal(_closeBuffer, 2, true, false, WebSocketFrameOption.ConnectionClose, WebSocketExtensionFlags.None);
                _clientStream.Close();
            }
            catch { }
        }
コード例 #6
0
        private void Close(WebSocketCloseReasons reason)
        {
            try
            {
                if (_isClosed)
                    return;

                _isClosed = true;

                ((UInt16)reason).ToBytes(_closeBuffer.Array, _controlBuffer.Offset);
                WriteInternal(_closeBuffer, 2, true, false, WebSocketFrameOption.ConnectionClose, WebSocketExtensionFlags.None);

                _clientStream.Close();
            }
            catch { }
        }
コード例 #7
0
        internal void Close(WebSocketCloseReasons reason)
        {
            try
            {
                if (Interlocked.CompareExchange(ref _isClosed,1,0) == 1)
                    return;

                ((UInt16)reason).ToBytesBackwards(_closeBuffer.Array, _closeBuffer.Offset);
                WriteInternal(_closeBuffer, 2, true, false, WebSocketFrameOption.ConnectionClose, WebSocketExtensionFlags.None);
                _clientStream.Close();
            }
            catch (Exception ex)
            {
                DebugLog.Fail("WebSocketConnectionRfc6455.Close", ex);
            }
        }