Get City/State/Country From IP

| | |

I have a lot of possible options on this page, as I find time I’ll clean this page
up a bit to make it more user friendly.

C# Free, Fast
JavaScript Free, Fast
Microsoft SQL

Using GeoPlugin.net XML Option

<h1>All Values</h1>
geoPlugin:
geoplugin_request: 208.67.222.222
geoplugin_status: 200
geoplugin_credit: Some of the returned data includes GeoLite data created by MaxMind, available from <a href="http://www.maxmind.com">http://www.maxmind.com</a>.
geoplugin_city: San Francisco
geoplugin_region: CA
geoplugin_areaCode: 415
geoplugin_dmaCode: 807
geoplugin_countryCode: US
geoplugin_countryName: United States
geoplugin_continentCode: NA
geoplugin_latitude: 37.769699
geoplugin_longitude: -122.393303
geoplugin_regionCode: CA
geoplugin_regionName: California
geoplugin_currencyCode: USD
geoplugin_currencySymbol: $
geoplugin_currencySymbol_UTF8: $
geoplugin_currencyConverter: 1
<h1>Specific Values</h1>
<strong>City, State:</strong> San Francisco, CA

<strong>Latitude, Longitude:</strong> 37.769699, -122.393303
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.Xml;
 
public partial class IPtoCityXML : System.Web.UI.Page
{
    //public static string sTestIP = "208.67.222.222";
    public static string sTestIP =  IpAddress();
 
    protected void Page_Load(object sender, EventArgs e)
    {
        #region Display All Values
        Response.Write("<h1>All Values</h1>");
        sGetAllDetails(sTestIP);
        #endregion Display All Values
 
        #region Display Specific Values
        Response.Write("<h1>Specific Values</h1>");
        Response.Write("<p><strong>City, State:</strong> " + sGetSpecificInformation(sTestIP, 1) + ", " + sGetSpecificInformation(sTestIP, 2) + "</p>");
        Response.Write("<p><strong>Latitude, Longitude:</strong> " + sGetSpecificInformation(sTestIP, 4) + ", " + sGetSpecificInformation(sTestIP, 5) + "</p>");
        #endregion Display Specific Values
    }
 
    private string IpAddress()
    {
        string strIpAddress;
        strIpAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        if (strIpAddress == null)
            strIpAddress = Request.ServerVariables["REMOTE_ADDR"];
        return strIpAddress;
    }
 
    public void sGetAllDetails(string sIPAddress)
    {
        System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader("http://www.geoplugin.net/xml.gp?ip=" + sIPAddress);
        string sContents = "";
        while (reader.Read())
        {
            reader.MoveToContent();
            if (reader.NodeType == System.Xml.XmlNodeType.Element)
                sContents += reader.Name + ": <" + reader.Name + "> ";
            if (reader.NodeType == System.Xml.XmlNodeType.Text)
                sContents += reader.Value + "<br/>";
        }
 
        Response.Write(sContents);
    }
 
    public string sGetSpecificInformation(string sIPAddress, int nOption)
    {
        string sContents = "";
        string sXMLElement = "";
 
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
 
        doc.Load("http://www.geoplugin.net/xml.gp?ip=" + sIPAddress);
 
        switch (nOption)
        {
            case 1:
                sXMLElement = "geoplugin_city";
                break;
            case 2:
                sXMLElement = "geoplugin_region";
                break;
            case 3:
                sXMLElement = "geoplugin_countryName";
                break;
            case 4:
                sXMLElement = "geoplugin_latitude";
                break;
            case 5:
                sXMLElement = "geoplugin_longitude";
                break;
        }
 
        System.Xml.XmlElement root = doc.DocumentElement;
        System.Xml.XmlNodeList lst = root.GetElementsByTagName(sXMLElement);
        foreach (System.Xml.XmlNode n in lst)
        {
            sContents += n.InnerText;
        }
        return sContents;
    }
}

Using MaxMind.com JavaScript Option

City
Region
Region Name
Postal Code
Country Code
Country Name
Latitude
Longitude
JavaScript
<script type="text/javascript" src="//j.maxmind.com/js/geoip.js">
  </script>
  <dl>
 
    <dt>City</dt>
    <dd>
      <script type="text/javascript">
        document.write(geoip_city());
      </script>
    </dd>
 
    <dt>Region</dt>
    <dd>
      <script type="text/javascript">
        document.write(geoip_region());
      </script>
    </dd>
 
    <dt>Region Name</dt>
    <dd>
      <script type="text/javascript">
        document.write(geoip_region_name());
      </script>
    </dd>
 
    <dt>Postal Code</dt>
    <dd>
      <script type="text/javascript">
        document.write(geoip_postal_code());
      </script>
    </dd>
 
    <dt>Country Code</dt>
    <dd>
      <script type="text/javascript">
        document.write(geoip_country_code());
      </script>
    </dd>
 
    <dt>Country Name</dt>
    <dd>
      <script type="text/javascript">
        document.write(geoip_country_name());
      </script>
    </dd>
 
    <dt>Latitude</dt>
    <dd>
      <script type="text/javascript">
        document.write(geoip_latitude());
      </script>
    </dd>
 
    <dt>Longitude</dt>
    <dd>
      <script type="text/javascript">
        document.write(geoip_longitude());
      </script>
    </dd>
   </dl>

This website uses GeoIP2 JavaScript from MaxMind.

Using MaxMind.com SQL Option

You can use the database or the web service, the code below requires the CSV from http://dev.maxmind.com/geoip/legacy/geolite/

Once you have downloaded the CSV, import it into your MSSQL database.

Once you have the database tables created you can follow the logic below

SQL
-- IP 8.8.8.8
-- (16777216 * o1) + (65536 * o2) + (256 * o3) + o4
-- (16777216 * 8) + (65536 * 8) + (256 * 8) + 8 = 134744072
 
--integer_ip = 2921648058
--o1 = int ( ipnum / 16777216 ) % 256;
--o2 = int ( ipnum / 65536    ) % 256;
--o3 = int ( ipnum / 256      ) % 256;
--o4 = int ( ipnum            ) % 256;
--address = ( o1, o2, o3, o4 ).join('.')
 
SELECT TOP 1 glcl.locId
    ,startIpNum
    ,endIpNum
    ,country
    ,region
    ,city
    ,postalCode
    ,latitude
    ,longitude
    ,metroCode
    ,areaCode
FROM [GeoLiteCity-Location] glcl
INNER JOIN [GeoLiteCity-Blocks] glcb ON glcl.locId = glcb.locId
WHERE '134744072' BETWEEN startIpNum
        AND endIpNum
 
-- OR
 
SELECT (city + ', ' + ltrim(isnull(region, '') + ' ' + isnull(postalCode, '')))
FROM [GeoCityLocation] glcl
INNER JOIN [GeoCityBlocks] glcb ON glcl.locId = glcb.locId
WHERE '1817375425' BETWEEN startIpNum
        AND endIpNum
Convert IP To INT Function
CREATE FUNCTION dbo.IPAddressToInteger (@IP AS VARCHAR(15))
RETURNS BIGINT
AS
BEGIN
    RETURN (CONVERT(BIGINT, PARSENAME(@IP, 1)) + CONVERT(BIGINT, PARSENAME(@IP, 2)) * 256 + CONVERT(BIGINT, PARSENAME(@IP, 3)) * 65536 + CONVERT(BIGINT, PARSENAME(@IP, 4)) * 16777216)
END
GO
SQL
-- Convert INT to IP Function
CREATE FUNCTION dbo.IntegerToIPAddress (@IP AS BIGINT)
RETURNS VARCHAR(15)
AS
BEGIN
    DECLARE @Octet1 TINYINT
    DECLARE @Octet2 TINYINT
    DECLARE @Octet3 TINYINT
    DECLARE @Octet4 TINYINT
    DECLARE @RestOfIP BIGINT
 
    SET @Octet1 = @IP / 16777216
    SET @RestOfIP = @IP - (@Octet1 * 16777216)
    SET @Octet2 = @RestOfIP / 65536
    SET @RestOfIP = @RestOfIP - (@Octet2 * 65536)
    SET @Octet3 = @RestOfIP / 256
    SET @Octet4 = @RestOfIP - (@Octet3 * 256)
 
    RETURN (CONVERT(VARCHAR, @Octet1) + '.' + CONVERT(VARCHAR, @Octet2) + '.' + CONVERT(VARCHAR, @Octet3) + '.' + CONVERT(VARCHAR, @Octet4))
END
GO

To simplify the calculation of IP into Integer use this function

C#
public string sIPToInteger(string sIP)
    {
        string[] sIPArray = sIP.Split('.');
        return (
            (16777216 * Int32.Parse(sIPArray[0]))
            +
            (65536 * Int32.Parse(sIPArray[1]))
            +
            (256 * Int32.Parse(sIPArray[2]))
            +
            Int32.Parse(sIPArray[3])
        ).ToString();
    }

Call to the function above with

C#
Response.Write(sIPToInteger("8.8.8.8"));

While I currently do not have a reason to reverse the conversion I have created a function for that as well with below

C#
public string sIntegerToIP(int nIPInt)
    {
        string o1, o2, o3, o4;
        o1 = ((nIPInt / 16777216) % 256).ToString();
        o2 = ((nIPInt / 65536) % 256).ToString();
        o3 = ((nIPInt / 256) % 256).ToString();
        o4 = ((nIPInt) % 256).ToString();
 
        return o1 + '.' + o2 + '.' + o3 + '.' + o4;
    }

Call to the function above with

C#
Response.Write(sIntegerToIP(134744072));

Complete source code

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class MSR : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(sIPToInteger("8.8.8.8"));
        Response.Write("<p>" + sIntegerToIP(Int32.Parse(sIPToInteger("8.8.8.8"))));
    }
 
    public string sIPToInteger(string sIP)
    {
        string[] sIPArray = sIP.Split('.');
        return (
            (16777216 * Int32.Parse(sIPArray[0]))
            +
            (65536 * Int32.Parse(sIPArray[1]))
            +
            (256 * Int32.Parse(sIPArray[2]))
            +
            Int32.Parse(sIPArray[3])
        ).ToString();
    }
 
    public string sIntegerToIP(int nIPInt)
    {
        string o1, o2, o3, o4;
        o1 = ((nIPInt / 16777216) % 256).ToString();
        o2 = ((nIPInt / 65536) % 256).ToString();
        o3 = ((nIPInt / 256) % 256).ToString();
        o4 = ((nIPInt) % 256).ToString();
 
        return o1 + '.' + o2 + '.' + o3 + '.' + o4;
    }
}

Sources:

Originally Posted on September 27, 2013
Last Updated on February 4, 2026
All information on this site is shared with the intention to help. Before any source code or program is ran on a production (non-development) system it is suggested you test it and fully understand what it is doing not just what it appears it is doing. I accept no responsibility for any damage you may do with this code.