/// <summary> /// Called when a connection is accepted. /// </summary> private void OnAccept(object sender, SocketAsyncEventArgs args) { var sock = args.AcceptSocket; if (!sock.Connected) return; // Wrap stuff in a try block, in case the socket is disposed of. try { var accept = true; // Do we accept multiple connections from the same address? if (!AllowMultipleConnections) lock (_clients) accept = _clients.All(cl => !cl.EndPoint.Equals(sock.RemoteEndPoint.ToIPEndPoint())); if (!accept) { _log.Warn("Disconnecting client from {0}; already connected.", sock.RemoteEndPoint); sock.Shutdown(SocketShutdown.Both); sock.Disconnect(false); sock.Close(); } else { // Add the client and thus start receiving. var client = new TcpClient(sock, this, _propagator); client.AddPermission(new ConnectedPermission()); AddClient(client); } } catch (Exception ex) { if (ex is SocketException) ExceptionManager.RegisterException(ex); if (!(ex is ObjectDisposedException)) throw; throw; } // Continue accepting with the event args we were using before. Accept(args); }