예제 #1
0
        public void IsAllowed_Peer()
        {
            var swarm = new Swarm();
            var peer  = new Peer
            {
                Id        = "QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h",
                Addresses = new MultiAddress[]
                {
                    "/ip4/127.0.0.1/ipfs/QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h"
                }
            };

            Assert.IsTrue(swarm.IsAllowed(peer));

            swarm.BlackList.Add(peer.Addresses.First());
            Assert.IsFalse(swarm.IsAllowed(peer));

            swarm.BlackList.Clear();
            swarm.BlackList.Add("/p2p/QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h");
            Assert.IsFalse(swarm.IsAllowed(peer));
        }
예제 #2
0
#pragma warning disable VSTHRD100 // Avoid async void methods
        /// <summary>
        ///   Called when the swarm has lost a connection to a peer.
        /// </summary>
        /// <param name="sender">
        ///   The swarm of peers.
        /// </param>
        /// <param name="disconnectedPeer">
        ///   The peer that was disconnected.
        /// </param>
        /// <remarks>
        ///   If the <see cref="MinConnections"/> is not reached, then another
        ///   peer is dialed.
        /// </remarks>
        async void OnPeerDisconnected(object sender, Peer disconnectedPeer)
#pragma warning restore VSTHRD100 // Avoid async void methods
        {
            var n = swarm.Manager.Connections.Count() + pendingConnects;

            if (!swarm.IsRunning || n >= MinConnections)
            {
                return;
            }

            // Find a random peer to connect with.
            var peers = swarm.KnownPeers
                        .Where(p => p.ConnectedAddress == null)
                        .Where(p => p != disconnectedPeer)
                        .Where(p => swarm.IsAllowed(p))
                        .Where(p => !swarm.HasPendingConnection(p))
                        .ToArray();

            if (peers.Length == 0)
            {
                return;
            }
            var rng  = new Random();
            var peer = peers[rng.Next(peers.Count())];

            Interlocked.Increment(ref pendingConnects);
            log.Debug($"Dialing {peer}");
            try
            {
                await swarm.ConnectAsync(peer).ConfigureAwait(false);
            }
            catch (Exception)
            {
                log.Warn($"Failed to dial {peer}");
            }
            finally
            {
                Interlocked.Decrement(ref pendingConnects);
            }
        }