In this tutorial, we demonstrate you on how to lookup IP address in bulk using VB.NET programming languages and IP2Location MySQL database. In this tutorial, we use the IP2Location LITE database to lookup country of origin from the visitor’s IP address. Free databases are available for download at IP2Location LITE database.
Below are the steps to set up the database for both IPv4 and IPv6 data and the sample codes
Step 1: Download IP2Location LITE database, unzip the file follow the instruction in order to create database table. Please refer to DB11 LITE for further information.
Step 2: Download the demo project and include into your C Sharp project.
Reading IP addresses and querying in bulk
Protected Sub DisplayFileContents(ByVal file As HttpPostedFile) Dim theStream As Stream = FileUpload1.PostedFile.InputStream Dim Display As StringBuilder = New StringBuilder() Using sr As New StreamReader(theStream) Dim line As String Dim Delimiter1() As Char = New Char() {","} While (1) line = sr.ReadLine() If line <> Nothing Then Dim iplist() As String = line.Split(Delimiter1, StringSplitOptions.None) For Each IP As String In iplist Display.Append("IP Address : " + IP.ToString() + "\n") Dim ip_addr As String = IP Dim ip_num As Long = ip_to_number(ip_addr) Dim query As String = "SELECT * FROM ip2location_db11_ipv4 WHERE ip_to >= " & ip_num & " order by ip_to limit 1" Dim data() As String = Get_Data(query) Dim country_code As String = data(0) Dim country_name As String = data(1) Dim city_name As String = data(2) Dim region_name As String = data(3) Dim latitude As String = data(4) Dim longitude As String = data(5) Dim zip_code As String = data(6) Dim time_zone As String = data(7) 'Define the result file that you want to output Dim filePath As String = Server.MapPath("~") + "result.csv" Using Sw As StreamWriter = System.IO.File.AppendText(filePath) Dim output As String = String.Format("""" + IP + """" + "," + """" + country_code + """" + "," + """" + country_name + """" + "," + """" + city_name + """" + "," + """" + region_name + """" + "," + """" + latitude + """" + "," + """" + longitude + """" + "," + """" + zip_code + """" + "," + """" + time_zone + """") Console.WriteLine(output) Sw.WriteLine(output) End Using Label3.Text = "Result File Path : " + Path.GetFullPath(filePath) + "<br>" Next Else Exit While End If End While End Using Label4.Text = "Please DELETE the result file if you want to upload a new file! <br>" End Sub
Retrieving data
Public Function Get_Data(ByVal query As String) As String() 'Database connection string, replace lower capital with MySQL settings Dim db_con_string As String = "SERVER=server;DATABASE=database;UID=userid;PASSWORD=password;" Using con As New MySqlConnection(db_con_string) Using cmd As New MySqlCommand() cmd.CommandText = query Using sda As New MySqlDataAdapter() cmd.Connection = con sda.SelectCommand = cmd Using ds As New DataSet() Dim dt As New DataTable() sda.Fill(dt) Dim country_code As Object = dt.Rows(0)("country_code") Dim country_name As Object = dt.Rows(0)("country_name") Dim region_name As Object = dt.Rows(0)("region_name") Dim city_name As Object = dt.Rows(0)("city_name") Dim latitude As Object = dt.Rows(0)("latitude") Dim longitude As Object = dt.Rows(0)("longitude") Dim zip_code As Object = dt.Rows(0)("zip_code") Dim timezone As Object = dt.Rows(0)("time_zone") Dim data() As String = {Convert.ToString(country_code), Convert.ToString(country_name), Convert.ToString(region_name), Convert.ToString(city_name), Convert.ToString(latitude), Convert.ToString(longitude), Convert.ToString(zip_code), Convert.ToString(timezone)} Return data End Using End Using End Using End Using End Function
Converting IP address to IP number
Public Function ip_to_number(ByVal ip_addr As String) Dim ip_block() As String Dim ip_num As Long ip_block = Split(ip_addr, ".") ip_num = (ip_block(0) * (256 ^ 3)) + (ip_block(1) * (256 ^ 2)) + (ip_block(2) * 256) + ip_block(3) Return ip_num End Function
Step 1: Download IP2Location LITE database, unzip the file follow the instruction in order to create database table. Please refer to DB11 LITE for further information.
Step 2: Download the demo project and include into your C Sharp project.
Reading IP addresses and querying in bulk
Protected Sub DisplayFileContents(ByVal file As HttpPostedFile) Dim theStream As Stream = FileUpload1.PostedFile.InputStream Dim Display As StringBuilder = New StringBuilder() Using sr As New StreamReader(theStream) Dim line As String Dim Delimiter1() As Char = New Char() {","} While (1) line = sr.ReadLine() If line <> Nothing Then Dim iplist() As String = line.Split(Delimiter1, StringSplitOptions.None) For Each IP As String In iplist Display.Append("IP Address : " + IP.ToString() + "\n") Dim ip_addr As String = IP Dim ip_num As System.Numerics.BigInteger = ip_to_number(ip_addr) Dim ip_no As String = ip_num.ToString() Dim query As String = "SELECT country_code,country_name,city_name,region_name,latitude,longitude,zip_code,time_zone FROM ip2location_db11 WHERE ip_to >= " & ip_no & " order by ip_to limit 1" Dim data() As String = Get_Data(query) Dim country_code As String = data(0) Dim country_name As String = data(1) Dim city_name As String = data(2) Dim region_name As String = data(3) Dim latitude As String = data(4) Dim longitude As String = data(5) Dim zip_code As String = data(6) Dim time_zone As String = data(7) 'Define the result file that you want to output Dim filePath As String = Server.MapPath("~") + "result.csv" Using Sw As StreamWriter = System.IO.File.AppendText(filePath) Dim output As String = String.Format("""" + IP + """" + "," + """" + country_code + """" + "," + """" + country_name + """" + "," + """" + city_name + """" + "," + """" + region_name + """" + "," + """" + latitude + """" + "," + """" + longitude + """" + "," + """" + zip_code + """" + "," + """" + time_zone + """") Console.WriteLine(output) Sw.WriteLine(output) End Using Label3.Text = "Result File Path : " + Path.GetFullPath(filePath) + "<br>" Next Else Exit While End If End While End Using Label4.Text = "Please DELETE the result file if you want to upload a new file! <br>" End Sub
Retrieving data
Public Function Get_Data(ByVal query As String) As String() 'Database connection string, replace lower capital with MySQL settings Dim db_con_string As String = "SERVER=server;DATABASE=database;UID=userid;PASSWORD=password;" Using con As New MySqlConnection(db_con_string) Using cmd As New MySqlCommand() cmd.CommandText = query Using sda As New MySqlDataAdapter() cmd.Connection = con sda.SelectCommand = cmd Using ds As New DataSet() Dim dt As New DataTable() sda.Fill(dt) Dim country_code As Object = dt.Rows(0)("country_code") Dim country_name As Object = dt.Rows(0)("country_name") Dim region_name As Object = dt.Rows(0)("region_name") Dim city_name As Object = dt.Rows(0)("city_name") Dim latitude As Object = dt.Rows(0)("latitude") Dim longitude As Object = dt.Rows(0)("longitude") Dim zip_code As Object = dt.Rows(0)("zip_code") Dim timezone As Object = dt.Rows(0)("time_zone") Dim data() As String = {Convert.ToString(country_code), Convert.ToString(country_name), Convert.ToString(region_name), Convert.ToString(city_name), Convert.ToString(latitude), Convert.ToString(longitude), Convert.ToString(zip_code), Convert.ToString(timezone)} Return data End Using End Using End Using End Using End Function
Converting IP address to IP number
Public Function ip_to_number(ByVal ip_addr As String) As System.Numerics.BigInteger Dim address As System.Net.IPAddress Dim ipnum As System.Numerics.BigInteger If System.Net.IPAddress.TryParse(ip_addr, address) Then Dim addrBytes() As Byte = address.GetAddressBytes() If System.BitConverter.IsLittleEndian Then Dim byteList As New System.Collections.Generic.List(Of Byte)(addrBytes) byteList.Reverse() addrBytes = byteList.ToArray() End If If addrBytes.Length > 8 Then 'IPv6 ipnum = System.BitConverter.ToUInt64(addrBytes, 8) ipnum <<= 64 ipnum += System.BitConverter.ToUInt64(addrBytes, 0) Else 'IPv4 ipnum = System.BitConverter.ToUInt32(addrBytes, 0) End If End If Return ipnum End Function