private void SyncPeerToPeersList(xServerPeers xServerPeerList, xServerPeer peer, bool seedCheck = false, bool removePeer = false) { var peersList = xServerPeerList.GetPeers(); int peerIndex = peersList.FindIndex(p => p.NetworkAddress == peer.NetworkAddress); if (removePeer) { peersList.Remove(peer); } else if (seedCheck) { if (peerIndex == -1) { peersList.Add(peer); } } else { if (peerIndex >= 0) { peersList[peerIndex] = peer; } else { peersList.Add(peer); } } lock (this.xServerPeersLock) { xServerPeerList.ReplacePeers(peersList); } }
private async Task XServerDiscoveryAsync(xServerPeers xServerPeerList) { var seedList = new ConcurrentBag <NetworkXServer>(); int topResult = 10; await this.xServerSettings.RetrieveNodes().ForEachAsync(10, this.nodeLifetime.ApplicationStopping, async(peer, cancellation) => { if (this.nodeLifetime.ApplicationStopping.IsCancellationRequested) { return; } string xServerURL = Utils.GetServerUrl(peer.NetworkProtocol, peer.NetworkAddress, peer.NetworkPort); this.logger.LogDebug($"Attempting connection to {xServerURL}."); var client = new RestClient(xServerURL); var topXServersRequest = new RestRequest("/gettop/", Method.GET); topXServersRequest.AddParameter("top", topResult); var topXServerResult = await client.ExecuteAsync <TopResult>(topXServersRequest, cancellation).ConfigureAwait(false); if (topXServerResult.StatusCode == HttpStatusCode.OK) { seedList.Add(peer); if (topXServerResult.Data?.XServers?.Count > 0) { var xServers = topXServerResult.Data.XServers; foreach (var xServer in xServers) { xServerURL = Utils.GetServerUrl(xServer.NetworkProtocol, xServer.NetworkAddress, xServer.NetworkPort); client = new RestClient(xServerURL); var pingRequest = new RestRequest("/ping/", Method.GET); var pingResponseTime = Stopwatch.StartNew(); var pingResult = await client.ExecuteAsync <PingResult>(pingRequest, cancellation).ConfigureAwait(false); pingResponseTime.Stop(); if (pingResult.StatusCode == HttpStatusCode.OK) { var ping = pingResult.Data; var newPeer = new xServerPeer() { Name = xServer.Name, NetworkProtocol = xServer.NetworkProtocol, NetworkAddress = xServer.NetworkAddress, NetworkPort = xServer.NetworkPort, Priority = xServer.Priotiry, Version = ping.Version, ResponseTime = pingResponseTime.ElapsedMilliseconds, Tier = ping.Tier }; SyncPeerToPeersList(xServerPeerList, newPeer); } } } } SyncSeedsToPeersList(xServerPeerList, seedList); }).ConfigureAwait(false); }
private void SyncSeedsToPeersList(xServerPeers xServerPeerList, ConcurrentBag <NetworkXServer> seedList) { foreach (var networkAddress in seedList) { var seedPeer = new xServerPeer() { Name = "Public Seed", NetworkProtocol = networkAddress.NetworkProtocol, NetworkAddress = networkAddress.NetworkAddress, NetworkPort = networkAddress.NetworkPort, Priority = -1, Version = "N/A", ResponseTime = 99999999, Tier = (int)TierLevel.Seed }; SyncPeerToPeersList(xServerPeerList, seedPeer, seedCheck: true); } }