Exemplo n.º 1
0
        public async Task StartAsync(byte[] initialNodes)
        {
            CheckDisposed();

            await MainLoop;

            MessageLoop.Start();
            if (RoutingTable.NeedsBootstrap)
            {
                RaiseStateChanged(DhtState.Initialising);
                InitializeAsync(initialNodes);
            }
            else
            {
                RaiseStateChanged(DhtState.Ready);
            }

            MainLoop.QueueTimeout(TimeSpan.FromSeconds(30), delegate {
                if (!Disposed)
                {
                    _ = RefreshBuckets();
                }
                return(!Disposed);
            });
        }
Exemplo n.º 2
0
        public async Task StopAsync()
        {
            await MainLoop;

            MessageLoop.Stop();
            RaiseStateChanged(DhtState.NotReady);
        }
Exemplo n.º 3
0
        public async Task StartAsync(ReadOnlyMemory <byte> initialNodes)
        {
            CheckDisposed();

            await MainLoop;

            MessageLoop.Start();
            if (RoutingTable.NeedsBootstrap)
            {
                RaiseStateChanged(DhtState.Initialising);
                // HACK: We want to disambiguate between 'decode one' and 'decode many' when using a Span<byte>
                InitializeAsync(Node.FromCompactNode(BEncodedString.FromMemory(initialNodes)));
            }
            else
            {
                RaiseStateChanged(DhtState.Ready);
            }

            MainLoop.QueueTimeout(TimeSpan.FromSeconds(30), delegate {
                if (!Disposed)
                {
                    _ = RefreshBuckets();
                }
                return(!Disposed);
            });
        }
Exemplo n.º 4
0
        public DhtEngine(DhtListener listener)
        {
            if (listener == null)
                throw new ArgumentNullException("listener");

            messageLoop = new MessageLoop(this, listener);
            timeout = TimeSpan.FromSeconds(15); // 15 second message timeout by default
            tokenManager = new TokenManager();
        }
Exemplo n.º 5
0
        public DhtEngine(DhtListener listener)
        {
            if (listener == null)
            {
                throw new ArgumentNullException("listener");
            }

            messageLoop  = new MessageLoop(this, listener);
            timeout      = TimeSpan.FromSeconds(15); // 15 second message timeout by default
            tokenManager = new TokenManager();
        }
Exemplo n.º 6
0
        public DhtEngine()
        {
            var monitor = new TransferMonitor();

            BucketRefreshTimeout = TimeSpan.FromMinutes(15);
            MessageLoop          = new MessageLoop(this, monitor);
            Monitor      = monitor;
            RoutingTable = new RoutingTable();
            State        = DhtState.NotReady;
            TokenManager = new TokenManager();
            Torrents     = new Dictionary <NodeId, List <Node> > ();

            MainLoop.QueueTimeout(TimeSpan.FromMinutes(5), () => {
                if (!Disposed)
                {
                    TokenManager.RefreshTokens();
                }
                return(!Disposed);
            });
        }
Exemplo n.º 7
0
        /// <summary>
        /// 构造DHT引擎
        /// </summary>
        /// <param name="listener">监听对象</param>
        public DhtEngine(IDhtListener listener)
        {
            if (listener == null)
            {
                throw new ArgumentNullException(nameof(listener));
            }

            BucketRefreshTimeout = TimeSpan.FromMinutes(15);
            MessageLoop          = new MessageLoop(this, listener);
            RoutingTable         = new RoutingTable();
            State        = DhtState.NotReady;
            TokenManager = new TokenManager();
            Torrents     = new Dictionary <NodeId, List <Node> > ();

            MainLoop.QueueTimeout(TimeSpan.FromMinutes(5), () => {
                if (!Disposed)
                {
                    TokenManager.RefreshTokens();
                }
                return(!Disposed);
            });
        }
Exemplo n.º 8
0
        internal async Task <SendQueryEventArgs> SendQueryAsync(QueryMessage query, Node node)
        {
            var e = default(SendQueryEventArgs);

            for (int i = 0; i < 4; i++)
            {
                e = await MessageLoop.SendAsync(query, node);

                // If the message timed out and we we haven't already hit the maximum retries
                // send again. Otherwise we propagate the eventargs through the Complete event.
                if (e.TimedOut)
                {
                    node.FailedCount++;
                    continue;
                }
                else
                {
                    node.Seen();
                    return(e);
                }
            }

            return(e);
        }
Exemplo n.º 9
0
        public async Task StartAsync(byte[] initialNodes)
        {
            CheckDisposed();

            await MainLoop;

            MessageLoop.Start();
            if (RoutingTable.NeedsBootstrap)
            {
                RaiseStateChanged(DhtState.Initialising);
                InitializeAsync(initialNodes);
            }
            else
            {
                RaiseStateChanged(DhtState.Ready);
            }

            MainLoop.QueueTimeout(TimeSpan.FromSeconds(30), delegate
            {
                if (Disposed)
                {
                    return(false);
                }

                foreach (Bucket b in RoutingTable.Buckets)
                {
                    if (b.LastChanged > BucketRefreshTimeout)
                    {
                        b.Changed();
                        RefreshBucketTask task = new RefreshBucketTask(this, b);
                        task.Execute();
                    }
                }
                return(!Disposed);
            });
        }
Exemplo n.º 10
0
 public async Task SetListenerAsync(IDhtListener listener)
 => await MessageLoop.SetListener(listener);
Exemplo n.º 11
0
 public void SetListener(IDhtListener listener)
 => MessageLoop.SetListener(listener);