private void AcceptConnection(AcceptConnectionEventArgs e) { var applicationProtocol = peerInitiator.PrepareAcceptIncomingConnection(e.TransportStream, out BitTorrentPeerInitiator.IContext context); applicationProtocol.AcceptConnection(new AcceptPeerConnectionEventArgs <PeerConnection>(e.TransportStream, () => { e.Accept(); var c = new PeerConnectionArgs(LocalPeerId, applicationProtocol.Metainfo, new QueueingMessageHandler(mainLoop, applicationProtocol)); return(peerInitiator.AcceptIncomingConnection(e.TransportStream, context, c)); })); }
public void ConnectToPeer(ITransportStream peerTransport) { try { lock (peersLock) { availablePeers.Remove(peerTransport); connectingPeers.Add(peerTransport); } peerTransport.Connect().ContinueWith(antecedent => { // TODO: run on main loop thread if (antecedent.Status != TaskStatus.RanToCompletion || !peerTransport.IsConnected) { Log.LogInformation($"Failed to connect to peer at {peerTransport.DisplayAddress}"); // Connection failed lock (peersLock) connectingPeers.Remove(peerTransport); // TODO: keep a record of failed connection peers return; } var connectionSettings = new PeerConnectionArgs( localPeerId, Metainfo, messageHandlerFactory(this)); var peer = peerInitiator.InitiateOutgoingConnection(peerTransport, connectionSettings); lock (peersLock) connectingPeers.Remove(peerTransport); PeerConnected(peer); }); } catch { lock (peersLock) { if (connectingPeers.Contains(peerTransport)) { connectingPeers.Remove(peerTransport); } } } }