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); }); }
public async Task StopAsync() { await MainLoop; MessageLoop.Stop(); RaiseStateChanged(DhtState.NotReady); }
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); }); }
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(); }
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(); }
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); }); }
/// <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); }); }
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); }
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); }); }
public async Task SetListenerAsync(IDhtListener listener) => await MessageLoop.SetListener(listener);
public void SetListener(IDhtListener listener) => MessageLoop.SetListener(listener);