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); } } }
protected void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { if (!_cancelationToken.Exchange(true)) { _queue.Cancel(); _workerThread.Join(); } } _disposed = true; }
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(); }