Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ********************************************************************************************
- using System;
- namespace whois
- {
- class Program
- {
- static int Main(string[] args)
- {
- int rc = 0;
- WhoisClient wh;
- string result;
- if (args.Length < 1)
- {
- Console.WriteLine("usage: whois <host_or_ip>");
- return 1;
- }
- wh = new WhoisClient();
- result = wh.Whois(args[0]);
- if (!string.IsNullOrEmpty(wh.errMsg))
- {
- Console.WriteLine(string.Format("# ERR: {0}", wh.errMsg));
- rc = 2;
- }
- if (string.IsNullOrEmpty(result))
- {
- return 3;
- }
- Console.WriteLine(string.Format("# {0} :: {1}", wh.srvName, args[0]));
- Console.Write(result);
- return rc;
- }
- }
- }
- ********************************************************************************************
- */
- using System;
- using System.IO;
- using System.Net.Sockets;
- using System.Text;
- namespace whois
- {
- class WhoisClient
- {
- #region privatedata
- private const int WHOIS_PORT = 43;
- private const string BASE_WHOIS = "whois.iana.org";
- private const string TAG_SINGLE = "to single out one record";
- private const string TAG_DOMAIN = "domain name: {0}";
- private const string TAG_REDIR = "whois server:";
- private const string TAG_HINT = "whois:";
- private string _lastErrMsg = null;
- private string _lastServer = null;
- #endregion
- #region instance
- /// <summary>
- /// instance the class
- /// </summary>
- public WhoisClient()
- {
- _lastErrMsg = null;
- _lastServer = null;
- }
- #endregion
- #region properties
- /// <summary>
- /// returns last error message
- /// </summary>
- public string errMsg
- {
- get { return _lastErrMsg; }
- }
- /// <summary>
- /// returns last whois server name
- /// </summary>
- public string srvName
- {
- get { return _lastServer; }
- }
- #endregion
- #region methods
- /// <summary>
- /// run a whois query
- /// </summary>
- /// <param name="query">query string (IP or domain name)</param>
- /// <param name="server">optional: server name or address</param>
- /// <param name="port">optional: server port</param>
- /// <returns>the whois lookup result or null</returns>
- public string Whois(string query, string server = "", int port = WHOIS_PORT)
- {
- string srv = server;
- if (string.IsNullOrEmpty(srv))
- {
- srv = getServer(query);
- if (string.IsNullOrEmpty(srv)) return null;
- }
- string result = QuerySrv(query, srv, port);
- string single = refineQuery(result, query);
- if (!string.IsNullOrEmpty(single))
- {
- result = QuerySrv(single, srv, port);
- if (!string.IsNullOrEmpty(result))
- {
- string patt = string.Format(TAG_DOMAIN, query.ToLower());
- int pos = result.ToLower().IndexOf(patt);
- if (pos > 0)
- {
- result = result.Substring(pos);
- }
- }
- }
- if (!string.IsNullOrEmpty(result))
- {
- string hint = getHint(result, TAG_REDIR);
- if (!string.IsNullOrEmpty(hint))
- {
- result = QuerySrv(query, hint, port);
- }
- }
- return result;
- }
- #endregion
- #region privatecode
- /// <summary>
- /// retrieves the whois server to use for a given query
- /// </summary>
- /// <param name="query">query string</param>
- /// <returns>server name or null</returns>
- private string getServer(string query)
- {
- string buff = QuerySrv(query, BASE_WHOIS, WHOIS_PORT);
- if (string.IsNullOrEmpty(buff)) return null;
- string srv = getHint(buff, TAG_HINT);
- return srv;
- }
- /// <summary>
- /// returns the hint/redirection for a query
- /// </summary>
- /// <param name="data">query result data</param>
- /// <param name="tag">redirect tag to search</param>
- /// <returns>redirect server name or null</returns>
- private string getHint(string data, string tag)
- {
- string buf = data.ToLower();
- int pos = buf.IndexOf(tag);
- if (pos < 1) return null;
- buf = buf.Substring(pos + tag.Length);
- pos = buf.IndexOf("\n");
- if (pos < 1) return null;
- buf = buf.Substring(0, pos).Trim();
- return buf;
- }
- /// <summary>
- /// checks if query result contains multiple entries
- /// </summary>
- /// <param name="data">query result</param>
- /// <param name="query">query string</param>
- /// <returns>query refinement string or null</returns>
- private string refineQuery(string data, string query)
- {
- string buf = data.ToLower();
- int pos = buf.IndexOf(TAG_SINGLE);
- if (pos < 1) return null;
- return "=" + query.ToUpper();
- }
- /// <summary>
- /// issues a whois query to the given server
- /// </summary>
- /// <param name="query">query string</param>
- /// <param name="server">server name or ip</param>
- /// <param name="port">server port</param>
- /// <returns>query result or null</returns>
- private string QuerySrv(string query, string server, int port = 43)
- {
- string result = null;
- // Console.WriteLine(string.Format("# querying {0}:{1} for {2}", server, port, query));
- _lastServer = server;
- try
- {
- Encoding enc = Encoding.ASCII;
- TcpClient sock = new TcpClient(server, port);
- using (Stream s = sock.GetStream())
- {
- byte[] qry = enc.GetBytes(query + "\r\n");
- byte[] buf = new byte[8192];
- StringBuilder resp = new StringBuilder();
- s.Write(qry, 0, qry.Length);
- int nbytes = 0;
- do
- {
- nbytes = s.Read(buf, 0, buf.Length);
- if (nbytes > 0)
- {
- resp.Append(enc.GetString(buf, 0, nbytes));
- }
- } while (nbytes > 0);
- result = resp.ToString();
- }
- sock.Close();
- }
- catch (Exception ex)
- {
- _lastErrMsg = string.Format("QuerySrv(\"{0}\",\"{1}\",{2}) :: {3}", query, server, port, ex.Message);
- result = null;
- }
- return result;
- }
- #endregion
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement