Beispiel #1
0
 /// <summary>
 /// Perform a DNS lookup for a Minecraft Service using the specified domain name
 /// </summary>
 /// <param name="domain">Input domain name, updated with target host if any, else left untouched</param>
 /// <param name="port">Updated with target port if any, else left untouched</param>
 /// <returns>TRUE if a Minecraft Service was found.</returns>
 public static bool MinecraftServiceLookup(ref string domain, ref ushort port)
 {
     if (!String.IsNullOrEmpty(domain) && domain.Any(c => char.IsLetter(c)))
     {
         try
         {
             Console.WriteLine("Resolving {0}...", domain);
             Heijden.DNS.Response    response   = new Heijden.DNS.Resolver().Query("_minecraft._tcp." + domain, Heijden.DNS.QType.SRV);
             Heijden.DNS.RecordSRV[] srvRecords = response.RecordsSRV;
             if (srvRecords != null && srvRecords.Any())
             {
                 //Order SRV records by priority and weight, then randomly
                 Heijden.DNS.RecordSRV result = srvRecords
                                                .OrderBy(record => record.PRIORITY)
                                                .ThenByDescending(record => record.WEIGHT)
                                                .ThenBy(record => Guid.NewGuid())
                                                .First();
                 string target = result.TARGET.Trim('.');
                 ConsoleIO.WriteLineFormatted(String.Format("§8Found server {0}:{1} for domain {2}", target, result.PORT, domain));
                 domain = target;
                 port   = result.PORT;
                 return(true);
             }
         }
         catch (Exception e)
         {
             ConsoleIO.WriteLineFormatted(String.Format("§8Failed to perform SRV lookup for {0}\n{1}: {2}", domain, e.GetType().FullName, e.Message));
         }
     }
     return(false);
 }
Beispiel #2
0
 public static bool MinecraftServiceLookup(ref string domain, ref ushort port)
 {
     if (!String.IsNullOrEmpty(domain) && domain.Any(c => char.IsLetter(c)))
     {
         try
         {
             Console.WriteLine("Resolving {0}...", domain);
             Heijden.DNS.Response    response   = new Heijden.DNS.Resolver().Query("_minecraft._tcp." + domain, Heijden.DNS.QType.SRV);
             Heijden.DNS.RecordSRV[] srvRecords = response.RecordsSRV;
             if (srvRecords != null && srvRecords.Any())
             {
                 //Order SRV records by priority and weight, then randomly
                 Heijden.DNS.RecordSRV result = srvRecords
                                                .OrderBy(record => record.PRIORITY)
                                                .ThenByDescending(record => record.WEIGHT)
                                                .ThenBy(record => Guid.NewGuid())
                                                .First();
                 string target = result.TARGET.Trim('.');
                 domain = target;
                 port   = result.PORT;
                 Console.WriteLine("检测到SRV记录地址:" + domain + ":" + port);
                 return(true);
             }
         }
         catch (Exception e)
         {
             Console.WriteLine("未能成功解析..." + e.Message);
         }
     }
     return(false);
 }
        /// <summary>
        /// Perform a DNS lookup for a Minecraft Service using the specified domain name
        /// </summary>
        /// <param name="domain">Input domain name, updated with target host if any, else left untouched</param>
        /// <param name="port">Updated with target port if any, else left untouched</param>
        /// <returns>TRUE if a Minecraft Service was found.</returns>
        public static bool MinecraftServiceLookup(ref string domain, ref ushort port)
        {
            bool   foundService = false;
            string domainVal    = domain;
            ushort portVal      = port;

            if (!String.IsNullOrEmpty(domain) && domain.Any(c => char.IsLetter(c)))
            {
                AutoTimeout.Perform(() =>
                {
                    try
                    {
                        Translations.WriteLine("mcc.resolve", domainVal);
                        Heijden.DNS.Response response      = new Heijden.DNS.Resolver().Query("_minecraft._tcp." + domainVal, Heijden.DNS.QType.SRV);
                        Heijden.DNS.RecordSRV[] srvRecords = response.RecordsSRV;
                        if (srvRecords != null && srvRecords.Any())
                        {
                            //Order SRV records by priority and weight, then randomly
                            Heijden.DNS.RecordSRV result = srvRecords
                                                           .OrderBy(record => record.PRIORITY)
                                                           .ThenByDescending(record => record.WEIGHT)
                                                           .ThenBy(record => Guid.NewGuid())
                                                           .First();
                            string target = result.TARGET.Trim('.');
                            ConsoleIO.WriteLineFormatted(Translations.Get("mcc.found", target, result.PORT, domainVal));
                            domainVal    = target;
                            portVal      = result.PORT;
                            foundService = true;
                        }
                    }
                    catch (Exception e)
                    {
                        ConsoleIO.WriteLineFormatted(Translations.Get("mcc.not_found", domainVal, e.GetType().FullName, e.Message));
                    }
                }, TimeSpan.FromSeconds(Settings.ResolveSrvRecordsShortTimeout ? 10 : 30));
            }

            domain = domainVal;
            port   = portVal;
            return(foundService);
        }