Advertisement
Guest User

C# simple smartwhois class

a guest
Feb 11th, 2016
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.90 KB | None | 0 0
  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Diagnostics;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9.  
  10. namespace NWhois
  11. {
  12.     class WhoisClient
  13.     {
  14.         #region privatedata
  15.         #endregion
  16.        
  17.         #region instance
  18.         public WhoisClient()
  19.         {
  20.  
  21.         }
  22.         #endregion
  23.  
  24.         #region properties
  25.         #endregion
  26.  
  27.         #region methods
  28.         public string Whois(string query, string server = "", int port = 43)
  29.         {
  30.             string srv = server;
  31.  
  32.             if (string.IsNullOrEmpty(srv))
  33.             {
  34.                 srv = getServer(query);
  35.                 if (string.IsNullOrEmpty(srv)) return null;
  36.             }
  37.  
  38.             string result = QuerySrv(query, srv, port);
  39.             string single = getSingle(result, query);
  40.             if (!string.IsNullOrEmpty(single))
  41.             {
  42.                 result = QuerySrv(single, srv, port);
  43.                 string patt = string.Format("domain name: {0}", query.ToLower());
  44.                 int pos = result.ToLower().IndexOf(patt);
  45.                 if (pos > 0) {
  46.                     result = result.Substring(pos);
  47.                 }
  48.  
  49.             }
  50.             string hint = getHint(result, "whois server:");
  51.             if (!string.IsNullOrEmpty(hint))
  52.             {
  53.                 result = QuerySrv(query, hint, port);
  54.             }
  55.             return result;
  56.         }
  57.         #endregion
  58.  
  59.         #region privatecode
  60.         private string getServer(string query)
  61.         {
  62.             string buff = QuerySrv(query, "whois.iana.org" , 43);
  63.             if (string.IsNullOrEmpty(buff)) return null;
  64.             string srv = getHint(buff, "whois:");
  65.             return srv;
  66.         }
  67.  
  68.         private string getHint(string data, string tag)
  69.         {
  70.             string buf = data.ToLower();
  71.             int pos = buf.IndexOf(tag);
  72.             if (pos < 1) return null;
  73.             buf = buf.Substring(pos + tag.Length);
  74.             pos = buf.IndexOf("\n");
  75.             if (pos < 1) return null;
  76.             buf = buf.Substring(0, pos).Trim();
  77.             return buf;
  78.         }
  79.  
  80.         private string getSingle(string data, string query)
  81.         {
  82.             string buf = data.ToLower();
  83.             int pos = buf.IndexOf("to single out one record");
  84.             if (pos < 1) return null;
  85.             return "=" + query.ToUpper();
  86.         }
  87.  
  88.         private string QuerySrv(string query, string server, int port = 43)
  89.         {
  90.             string result = null;
  91.  
  92.             // Console.WriteLine(string.Format("QuerySrv(\"{0}\",\"{1}\",{2})", query, server, port));
  93.  
  94.             try
  95.             {
  96.                 Encoding enc = Encoding.ASCII;
  97.                 TcpClient sock = new TcpClient(server, port);
  98.                 using (Stream s = sock.GetStream())
  99.                 {
  100.                     byte[] qry = enc.GetBytes(query + "\r\n");
  101.                     byte[] buf = new byte[8192];
  102.                     StringBuilder resp = new StringBuilder();
  103.                     s.Write(qry, 0, qry.Length);
  104.                     int nbytes = 0;
  105.                     do
  106.                     {
  107.                         nbytes = s.Read(buf, 0, buf.Length);
  108.                         if (nbytes > 0)
  109.                         {
  110.                             resp.Append(enc.GetString(buf, 0, nbytes));
  111.                         }
  112.                     } while (nbytes > 0);
  113.                     result = resp.ToString();
  114.                 }
  115.                 sock.Close();
  116.             }
  117.             catch (Exception ex)
  118.             {
  119.                 Console.WriteLine(string.Format("ERR: QuerySrv(\"{0}\",\"{1}\",{2}) :: {3}", query, server, port, ex.Message));
  120.                 result = null;
  121.             }
  122.  
  123.             return result;
  124.         }
  125.         #endregion
  126.  
  127.     }
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement