/// <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); }
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); }