private void EndCreateConnection(bool succeeded, int count, object state) { AsyncConnectState connect = (AsyncConnectState)state; pendingConnects.Remove(connect); if (connect.Manager.Engine == null || !connect.Manager.Mode.CanAcceptConnections) { connect.Connection.Dispose(); return; } try { connect.Manager.Peers.ConnectingToPeers.Remove(connect.Peer); if (!succeeded) { Logger.Log(null, "ConnectionManager - Failed to connect{0}", connect.Peer); connect.Manager.RaiseConnectionAttemptFailed( new PeerConnectionFailedEventArgs(connect.Manager, connect.Peer, Direction.Outgoing, "EndCreateConnection")); connect.Peer.FailedConnectionAttempts++; connect.Connection.Dispose(); connect.Manager.Peers.BusyPeers.Add(connect.Peer); } else { PeerId id = new PeerId(connect.Peer, connect.Manager); id.Connection = connect.Connection; connect.Manager.Peers.ActivePeers.Add(connect.Peer); Logger.Log(id.Connection, "ConnectionManager - Connection opened"); ProcessFreshConnection(id); } } catch (Exception) { // FIXME: Do nothing now? } finally { // Try to connect to another peer TryConnect(); } }
internal void ConnectToPeer(TorrentManager manager, Peer peer) { // Connect to the peer. IConnection connection = ConnectionFactory.Create(peer.ConnectionUri); if (connection == null) { return; } peer.LastConnectionAttempt = DateTime.Now; AsyncConnectState c = new AsyncConnectState(manager, peer, connection); pendingConnects.Add(c); manager.Peers.ConnectingToPeers.Add(peer); NetworkIO.EnqueueConnect(connection, endCreateConnectionCallback, c); }