コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 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);
     }
 }