Exemplo n.º 1
0
        private void WriteHandlerInternal(IAsyncResult result)
        {
            switch (_error)
            {
            case SocketError.Success:
            case SocketError.IOPending:
                break;

            default:
                CloseSocket();
                return;
            }

            try
            {
                var transferedBytes = _socket.EndSend(result);

                _writeQueue.Peek().ReadCompleted(transferedBytes);

                if (_writeQueue.Peek().GetActiveSize() <= 0)
                {
                    _writeQueue.Dequeue().Dispose();
                }

                _isWritingAsync.Exchange(false);

                if (_writeQueue.Count > 0)
                {
                    AsyncProcessQueue();
                }
                else if (_closing)
                {
                    CloseSocket();
                }
            }
            catch (Exception ex)
            {
                CloseSocket();

                if (LogException)
                {
                    FEL_LOG_WARN("network", "SocketBase::WriteHandlerInternal: {0} errored: ({1})", _remoteAddress.ToString(), ex.Message);
                }
            }
        }
Exemplo n.º 2
0
        protected void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            if (disposing)
            {
                if (!_cancelationToken.Exchange(true))
                {
                    _queue.Cancel();
                    _workerThread.Join();
                }
            }

            _disposed = true;
        }
Exemplo n.º 3
0
        public void CloseSocket()
        {
            if (_closed.Exchange(true))
            {
                return;
            }

            if (_socket.Connected)
            {
                try
                {
                    _socket.Shutdown(SocketShutdown.Send);
                }
                catch (SocketException ex)
                {
                    FEL_LOG_DEBUG("network", "SocketBase::CloseSocket: {0} errored when shutting down socket: ({1})", _remoteAddress.ToString(), ex.Message);
                }
            }

            OnClose();
        }