How to retrieve a visitor's IP address
Every visitor to your site or web application has an IP address. It is quite handy to be able to get that address. It can be used for security logging, or perhaps tracing. It can also be used to determine where they are in the world, or at least where their ISP is.
The difficulty is when they are behind a proxy of some sort, and you can only see the IP address of the proxy server. So, here are the code snippets in ASP.NET that first check for an IP addresses that's forwarded from behind a proxy, and if there's none, then just gets the IP address. Here's the same IP retriever with proxy detection in .NET, but in VB.NET:
Collapse | Copy Code
Dim nowip As String
nowip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If nowip = "" Then
nowip = Request.ServerVariables("End If
How do I convert an IP address to an IP number?
IP address (IPV4) is divided into four sub-blocks. Each sub-block has a different weight number, each powered by 256. The IP number is being used in the database because it is efficient to search between a range of numbers in the database.
The beginning IP number and the ending IP number are calculated based on the following formula:
Collapse | Copy Code
IP Number = 16777216*w + 65536*x + 256*y + z (1)
where:
Collapse | Copy Code
IP Address = w.x.y.z
For example, if the IP address is "202.186.13.4", then its IP number is "3401190660" based on the above formula.
Collapse | Copy Code
IP Address = 202.186.13.4
So, w = 202, x = 186, y = 13 and z = 4
IP Number = 16777216*202 + 65536*186 + 256*13 + 4
= 3388997632 + 12189696 + 3328 + 4
= 3401190660
To reverse the IP number to the IP address:
Collapse | Copy Code
w = int ( IP Number / 16777216 ) % 256
x = int ( IP Number / 65536 ) % 256
y = int ( IP Number / 256 ) % 256
z = int ( IP Number ) % 256
where, %
is the mod operator and int
returns the integer part of the division.
How do I retrieve the country name and the country code from the IP number?
Search the IP-country database to match a unique record that has the IP number that fits between the beginning IP number and the ending IP number.
For example, the IP address "202.186.13.4" is equivalent to the IP number "3401190660". It belongs to the following record in the database because it is between the beginning and the the ending of the IP number:
Collapse | Copy Code
"3401056256","3401400319","MY","MALAYSIA"
From the recordset, the country name is Malaysia and the country code is MY. Here is a useful link.
How do I use this database
CSV file format
The CSV file contains four fields:
- Beginning of the IP address range
- Ending of the IP address range
- Two-character country code based on ISO 3166
- Three-character country code based on ISO 3166
- Country name based on ISO 3166
Collapse | Copy Code
"0033996344","0033996351","GB","GBR","UNITED KINGDOM"
"0050331648","0083886079","US","USA","UNITED STATES"
"0094585424","0094585439","SE","SWE","SWEDEN"
Field |
Data Type |
Field Description |
IP_FROM |
NUMERICAL (DOUBLE) |
Beginning of the IP address range. |
IP_TO |
NUMERICAL (DOUBLE) |
Ending of the IP address range. |
COUNTRY_CODE2 |
CHAR(2) |
Two-character country code based on ISO 3166. |
COUNTRY_CODE3 |
CHAR(3) |
Three-character country code based on ISO 3166. |
COUNTRY_NAME |
VARCHAR(50) |
Country name based on ISO 3166 |
Download CSV database
Convert to Access database
Here is the code-behind:
Collapse | Copy Code
Partial Class How_to_Convert_IP_Address_Country _
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles Me.Load
Dim nowip As String
nowip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
If nowip = "" Then
nowip = Request.ServerVariables(" End If
If txtIPAddress.Text = "" Then
txtIPAddress.Text = nowip
End If
lblError.Text = ""
End Sub
Protected Sub Button1_Click(ByVal sender As Object,_
ByVal e As System.EventArgs) Handles Button1.Click
On Error GoTo HandleError
Dim dottedip As String
Dim Dot2LongIP As Double
Dim PrevPos As Double
Dim pos As Double
Dim num As Double
dottedip = txtIPAddress.Text
For i = 1 To 4
pos = InStr(PrevPos + 1, dottedip, ".", 1)
If i = 4 Then
pos = Len(dottedip) + 1
End If
num = Int(Mid(dottedip, PrevPos + 1, pos - PrevPos - 1))
PrevPos = pos
Dot2LongIP = ((num Mod 256) * (256 ^ (4 - i))) + Dot2LongIP
Next
txtIPNumber.Text = Dot2LongIP
HandleError:
lblError.Text = Err.Description
End Sub
End Class
Here is the output:
A free IP-Country List can be obtained at
http://www.ip2nation.com/ The database is in SQL format. It can be imported/restored into MySQL, MSSQL, SQLite or any database that uses standard SQL query. Below is a sample of retrieving the Country from IP:
public static string GetCountry()
{
string ip = "66.249.73.168";
string country = "";
if (ip == "::1" || ip == "127.0.0.1")
return "Localhost";
string[] ips = ip.Split('.');
long w = long.Parse(ips[0]) * 16777216;
long x = long.Parse(ips[1]) * 65536;
long y = long.Parse(ips[2]) * 256;
long z = long.Parse(ips[3]);
long ipNumber = w + x + y + z;
using (MySqlConnection conn = new MySqlConnection(config.ConStr))
{
using (MySqlCommand cmd = new MySqlCommand())
{
cmd.Connection = conn;
conn.Open();
cmd.CommandText = @"select a.country from ip2nationcountries a
inner join ip2nation b on a.code = b.country
where b.ip < " + ipNumber + @"
order by b.ip desc limit 0,1;";
country = cmd.ExecuteScalar() + "";
conn.Close();
}
}
return country;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现