public static List <HostnamePortPair> LookupSRV(string name) { List <HostnamePortPair> addresses = new List <HostnamePortPair>(); DnsQueryRequest request = new DnsQueryRequest(); IPAddress currentDns = GetActiveDnsServer(); if (currentDns == null) { return(addresses); } try { DnsQueryResponse response = request.Resolve(name, NsType.SRV, NsClass.INET, ProtocolType.Udp); foreach (IDnsRecord record in response.Answers) { if (record is SrvRecord) { SrvRecord srvRecord = (SrvRecord)record; addresses.Add(new HostnamePortPair(srvRecord.HostName, srvRecord.Port)); } } } catch (Exception) { } return(addresses); }
static void Main(string[] args) { DnsQueryRequest request3 = new DnsQueryRequest(); DnsQueryResponse response3 = request3.Resolve("gmail.com", NsType.MX, NsClass.INET, ProtocolType.Tcp); OutputResults(response3); Console.ReadLine(); }
static void Main(string[] args) { // Test TCP request DnsQueryRequest request = new DnsQueryRequest(); DnsQueryResponse response = request.Resolve("www.google.com", NsType.A, NsClass.INET, ProtocolType.Tcp); OutputResults(response); // Test UDP request DnsQueryRequest request2 = new DnsQueryRequest(); DnsQueryResponse response2 = request.Resolve("www.google.com", NsType.A, NsClass.INET, ProtocolType.Udp); OutputResults(response2); // Example usage of security provider. // DnsQueryRequest request3 = new DnsQueryRequest(); // DnsQueryResponse response3 = request3.Resolve("a.tsig.secured.server", "a.server.to.lookup", NsType.A, NsClass.INET, ProtocolType.Udp, new TsigMessageSecurityProvider("sharedkeyname", "shared key as base 64 string", 300)); Console.ReadLine(); }
static string getLdapServer() { Domain localDomain = Domain.GetCurrentDomain(); string localDomainAsString = localDomain.ToString(); DnsQueryRequest request = new DnsQueryRequest(); DnsQueryResponse Response = request.Resolve($"_ldap.{localDomainAsString}", NsType.A, NsClass.ANY, System.Net.Sockets.ProtocolType.Udp); string answer = Response.AuthoritiveNameServers[0].Answer; int indexOfDomain = answer.IndexOf($".{localDomainAsString}"); int lengthToSkip = 20; int lengthOfLdapServer = indexOfDomain - lengthToSkip; string nameOfLdapServer = $"{answer.Substring(lengthToSkip, lengthOfLdapServer)}.{localDomainAsString}"; return(nameOfLdapServer); }
protected void ResolveHostName() { try { var request = new DnsQueryRequest(); var response = request.Resolve ( String.Format("{0}.{1}", XmppCodes.XmppSrvRecordPrefix, ConnectionString.HostName), NsType.SRV, NsClass.INET, ProtocolType.Tcp ); foreach (var record in response.Answers.OfType <SrvRecord>()) { HostName = record.HostName; } } catch // TODO: logging of exceptions? { } }
private void btnLookup_Click(object sender, EventArgs e) { NsType lookupType = (NsType)((FieldInfo)lstBxQueryType.SelectedValue).GetValue(null); DnsQueryRequest request = new DnsQueryRequest(); DnsQueryResponse response = request.Resolve(txtDnsServer.Text, txtNameToLookup.Text, lookupType, NsClass.INET, ProtocolType.Udp); StringBuilder sb = new StringBuilder(1024); sb.Append("Bytes received: " + response.BytesReceived); sb.Append("\r\n"); // Enumerate the Authoritive Name Servers Records sb.Append("Authoritive Name Servers:"); sb.Append("\r\n"); foreach (IDnsRecord record in response.AuthoritiveNameServers) { sb.Append(record.Answer); sb.Append("\r\n"); sb.Append(" |--- RDATA Field Length: "); sb.Append(record.DnsHeader.DataLength); sb.Append("\r\n"); sb.Append(" |--- Name: "); sb.Append(record.DnsHeader.Name); sb.Append("\r\n"); sb.Append(" |--- NS Class: "); sb.Append(record.DnsHeader.NsClass); sb.Append("\r\n"); sb.Append(" |--- NS Type: "); sb.Append(record.DnsHeader.NsType); sb.Append("\r\n"); sb.Append(" |--- TTL: "); sb.Append(record.DnsHeader.TimeToLive); sb.Append("\r\n"); } // Enumerate the Answer Records sb.Append("Answers:"); sb.Append("\r\n"); foreach (IDnsRecord record in response.Answers) { sb.Append(record.Answer); sb.Append("\r\n"); sb.Append(" |--- RDATA Field Length: "); sb.Append(record.DnsHeader.DataLength); sb.Append("\r\n"); sb.Append(" |--- Name: "); sb.Append(record.DnsHeader.Name); sb.Append("\r\n"); sb.Append(" |--- NS Class: "); sb.Append(record.DnsHeader.NsClass); sb.Append("\r\n"); sb.Append(" |--- NS Type: "); sb.Append(record.DnsHeader.NsType); sb.Append("\r\n"); sb.Append(" |--- TTL: "); sb.Append(record.DnsHeader.TimeToLive); sb.Append("\r\n"); } sb.Append("Additional Records"); sb.Append("\r\n"); foreach (IDnsRecord record in response.AdditionalRecords) { sb.Append(record.Answer); sb.Append("\r\n"); sb.Append(" |--- RDATA Field Length: "); sb.Append(record.DnsHeader.DataLength); sb.Append("\r\n"); sb.Append(" |--- Name: "); sb.Append(record.DnsHeader.Name); sb.Append("\r\n"); sb.Append(" |--- NS Class: "); sb.Append(record.DnsHeader.NsClass); sb.Append("\r\n"); sb.Append(" |--- NS Type: "); sb.Append(record.DnsHeader.NsType); sb.Append("\r\n"); sb.Append(" |--- TTL: "); sb.Append(record.DnsHeader.TimeToLive); sb.Append("\r\n"); } txtOutput.Text = sb.ToString(); }
void MCPingCommand(CommandDetails command) { if (command.Arguments.Count <= 0) { Chat(command.Channel.Name, command.Pinger + ColorGeneral + "That command is written as: " + ColorHighlightMajor + Prefixes[0] + command.Name + " <Minecraft server IP address>"); return; } IRCUser user = new IRCUser(command.Arguments[0]); string IP = user.Settings.ReadString("general.minecraft_server_ip", null); if (IP == null) { IP = command.Arguments[0]; } ushort port = 0; if (IP.Contains(':')) { string[] dat = IP.Split(new char[] { ':' }, 2); IP = dat[0]; port = Utilities.StringToUShort(dat[1]); } if (port == 0) { try { DnsQueryRequest dqr = new DnsQueryRequest(); DnsQueryResponse resp = dqr.Resolve("_minecraft._tcp." + IP, NsType.SRV, NsClass.ANY, ProtocolType.Tcp); if (resp != null) { for (int i = 0; i < resp.AdditionalRRecords.Count; i++) { if (resp.AdditionalRRecords[i] is SrvRecord) { port = (ushort)((SrvRecord)resp.AdditionalRRecords[i]).Port; } } for (int i = 0; i < resp.Answers.Length; i++) { if (resp.Answers[i] is SrvRecord) { port = (ushort)((SrvRecord)resp.Answers[i]).Port; } } } else { Logger.Output(LogType.DEBUG, "Null SRV record."); } if (port == 0) { port = (ushort)25565; } } catch (Exception ex) { Logger.Output(LogType.ERROR, "Pinging a SRV record for a minecraft server: " + ex.ToString()); port = 25565; } } Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { Stopwatch Timer = new Stopwatch(); Timer.Reset(); Timer.Start(); sock.SendBufferSize = 8192; sock.ReceiveBufferSize = 8192 * 10; sock.ReceiveTimeout = 3000; sock.SendTimeout = 3000; IAsyncResult result = sock.BeginConnect(IP, port, null, null); bool timeout = !result.AsyncWaitHandle.WaitOne(5000, true); if (timeout) { throw new Exception("Connection timed out"); } if (!sock.Connected) { throw new Exception("Failed to connect"); } byte[] address = UTF8.GetBytes(IP); int packlen = 1 + 1 + 1 + address.Length + 2 + 1; byte[] send = new byte[1 + packlen + 1 + 1]; byte[] portbytes = BitConverter.GetBytes(port).Reverse().ToArray(); send[0] = (byte)packlen; // packet length send[1] = (byte)0x00; // Packet ID send[2] = (byte)0x04; // Protocol Version send[3] = (byte)address.Length; // Address string length address.CopyTo(send, 4); // Address string portbytes.CopyTo(send, address.Length + 4); // Port send[address.Length + 6] = (byte)0x01; // Next state send[address.Length + 7] = (byte)0x01; // Next packet length send[address.Length + 8] = (byte)0x00; // Empty state request packet ~ packet ID sock.Send(send); int length = 0; // Packet size -> packet ID -> JSON length for (int x = 0; x < 2; x++) { length = 0; int j = 0; while (true) { byte[] recd = new byte[1]; sock.Receive(recd, 1, SocketFlags.None); int k = recd[0]; length |= (k & 0x7F) << j++ *7; if (j > 5) { throw new Exception("VarInt too big"); } if ((k & 0x80) != 128) { break; } if (Timer.ElapsedMilliseconds > 7000) { throw new Exception("Timeout while reading response"); } } if (x == 0) { byte[] resp = new byte[1]; sock.Receive(resp, 1, SocketFlags.None); } } int gotten = 0; byte[] response = new byte[length]; while (gotten < length) { byte[] gotbit = new byte[length - gotten]; int newgot = sock.Receive(gotbit, length - gotten, SocketFlags.None); gotbit.CopyTo(response, gotten); gotten += newgot; if (Timer.ElapsedMilliseconds > 7000) { throw new Exception("Timeout while reading response"); } } string fullresponse = UTF8.GetString(response); int ind = fullresponse.IndexOf('{'); if (ind < 0) { throw new Exception("Invalid response packet - is that an actual minecraft server?"); } fullresponse = fullresponse.Substring(ind); Dictionary <string, dynamic> dict = new JavaScriptSerializer().Deserialize <Dictionary <string, dynamic> >(fullresponse.Trim()); string version = dict["version"]["name"].ToString(); string versionnum = dict["version"]["protocol"].ToString(); string players_on = dict["players"]["online"].ToString(); string players_max = dict["players"]["max"].ToString(); string description; if (dict["description"] is Dictionary <String, Object> ) { description = dict["description"]["text"].ToString(); } else { description = dict["description"].ToString(); } Chat(command.Channel.Name, command.Pinger + ColorGeneral + "Server: " + IP + ":" + port.ToString() + ", MOTD: '" + Utilities.mctoirc(description) + ColorGeneral + "', players: " + players_on + "/" + players_max + ", version: " + Utilities.mctoirc(version)); } catch (Exception ex) { Logger.Output(LogType.DEBUG, "Pinging minecraft server: " + ex.ToString()); Chat(command.Channel.Name, command.Pinger + ColorGeneral + "Couldn't ping server: internal exception: " + ex.Message); } finally { sock.Close(); } }
private void RegisterTrunk(Trunk trunk) { trunk.State = Trunk.States.WaitingDns; var match = Regex.Match(trunk.OutgoingProxy, "(?<url>[^:]+)(:(?<port>[0-9]*))?"); if (match.Success == false) { trunk.ErrorMessage = @"Invalid outgouing proxy URL"; } else { var hostname = match.Groups["url"].Value; int?port = null; if (match.Groups["port"].Success) { port = int.Parse(match.Groups["port"].Value); } IPAddress address; if (IPAddress.TryParse(hostname, out address)) { trunk.SetServerEndPoint(address, port ?? 5060); trunk.State = Trunk.States.Waiting200or401; SendRegister(trunk, trunk.RegisterDuration); } else { try { var prefixes = new string[] { @"_sip._tcp.", @"_sip._udp." }; Transports transport = Transports.None; SrvRecord record = null; foreach (var prefix in prefixes) { var request = new DnsQueryRequest(); var response = request.Resolve(prefix + hostname, NsType.SRV, NsClass.INET, ProtocolType.Udp); if (response.Answers.Length > 0) { record = response.Answers[0] as SrvRecord; } if (record != null) { if (prefix.Contains(@"tcp")) { transport = Transports.Tcp; } if (prefix.Contains(@"udp")) { transport = Transports.Udp; } break; } } if (record == null) { trunk.ErrorMessage = @"Failed to get SRV record"; } else { var addresses = Dns.GetHostAddresses(record.HostName); if (addresses.Length < 0) { trunk.ErrorMessage = @"Failed to get DNS A record for " + record.HostName; } else { trunk.SetServerEndPoint(transport, addresses[0], port ?? record.Port); trunk.State = Trunk.States.Waiting200or401; SendRegister(trunk, trunk.RegisterDuration); } } } catch (Exception ex) { trunk.ErrorMessage = ex.Message; } } } }