Ejemplo n.º 1
0
        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));
            }));
        }
Ejemplo n.º 2
0
        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);
                    }
                }
            }
        }