private void EndTcpConnection(Server <C> .Connection <C> connection) { if (connection.Close()) { this.OnEndTcpConnection(connection); if (connection.Socket.Connected) { try { connection.Socket.Shutdown(SocketShutdown.Both); } catch (SocketException) { } } if (connection.IsSocketAccepted && this.socketReuseEnabled) { try { try { ServerAsyncEventArgs serverAsyncEventArgs = EventArgsManager.Get(); serverAsyncEventArgs.FreeBuffer(); serverAsyncEventArgs.DisconnectReuseSocket = true; serverAsyncEventArgs.Completed = new ServerAsyncEventArgs.CompletedEventHandler(this.Disconnect_Completed); if (!connection.Socket.DisconnectAsync(serverAsyncEventArgs)) { serverAsyncEventArgs.OnCompleted(connection.Socket); } } catch (SocketException) { } } catch (NotSupportedException) { this.socketReuseEnabled = false; } } if (!this.socketReuseEnabled) { connection.Socket.Close(); } } }
private void EnqueueAsyncAccepts(object stateInfo) { lock (this.sync) { while (true) { int num = Thread.VolatileRead(ref this.acceptBacklog); if (!this.isRunning || num >= this.minAcceptBacklog) { break; } if (Interlocked.CompareExchange(ref this.acceptBacklog, num + 1, num) == num) { ServerAsyncEventArgs serverAsyncEventArgs = EventArgsManager.Get(); serverAsyncEventArgs.FreeBuffer(); this.listener.AcceptAsync(serverAsyncEventArgs, new ServerAsyncEventArgs.CompletedEventHandler(this.Accept_Completed)); } } } }