- 浏览: 21767 次
- 性别:
- 来自: 青岛
最近访客 更多访客>>
最新评论
-
Hooopo:
既然纯真数据库数据比PHPwind精确,何不用纯真?按照楼主分 ...
IPParse: IP 地址查询 -
wosmvp:
convert_ip_format.rb,不是BUG,指特殊或 ...
IPParse: IP 地址查询 -
Hooopo:
看了你分割后的文件,其他都是ip段的第一个字段做文件名,但是有 ...
IPParse: IP 地址查询 -
Hooopo:
引用有效代码30多行,使用了PHPWind的IP数据库(稍稍改 ...
IPParse: IP 地址查询 -
jiyanliang:
js好像不能直接操作文件
js 下载文件
1)在shell中:
$ ipparse 218.58.88.175 212.1.1.1 192.245.148.0 116.254.254.0
218.58.88.175 => 山东省青岛市开发区
212.1.1.1 => 意大利
192.245.148.0 => 阿尔及利亚
116.254.254.0 => 广东省广州市
2)程序中:
require ‘rubygems’
require ‘ipparse’
IPParse.parse(‘218.58.88.175’) # => 山东省青岛市开发区
有效代码30多行,使用了PHPWind的IP数据库(稍稍改了改格式,源码里提供了工具)
分析10000个随机IP 需要5秒左右的时间
地址:http://github.com/wosmvp/ipparse/tree/master
安装:(申请了RubyForge ipparse 目前还没有审核)
$ git clone git://github.com/wosmvp/ipparse.git
$ cd ipparse
$ rake install (可能需要安装 echoe )
------
http://www.zhangjinzhu.com
用的二分
全部代码
速度过会上。
我试了下你的这个puts IPParse.parse('222.222.222.222')怎么找不到。而且我不喜欢打开一个文件不自己关闭它。我改成这样了,用的ruby1.9.1所以有最上面那行。不知道有没有什么BUG!
用的二分
全部代码
速度过会上。
这个版本早过时了
非文本修改起来比较麻烦……呵呵
$ ipparse 218.58.88.175 212.1.1.1 192.245.148.0 116.254.254.0
218.58.88.175 => 山东省青岛市开发区
212.1.1.1 => 意大利
192.245.148.0 => 阿尔及利亚
116.254.254.0 => 广东省广州市
2)程序中:
require ‘rubygems’
require ‘ipparse’
IPParse.parse(‘218.58.88.175’) # => 山东省青岛市开发区
有效代码30多行,使用了PHPWind的IP数据库(稍稍改了改格式,源码里提供了工具)
分析10000个随机IP 需要5秒左右的时间
地址:http://github.com/wosmvp/ipparse/tree/master
安装:(申请了RubyForge ipparse 目前还没有审核)
$ git clone git://github.com/wosmvp/ipparse.git
$ cd ipparse
$ rake install (可能需要安装 echoe )
------
http://www.zhangjinzhu.com
评论
17 楼
orange0513
2009-02-19
wosmvp 写道
QuakeWang 写道
JavaEye的IP解析也是用纯真IP数据库查询算法写的,它比较快,而且数据格式比较小,小于10M,可以一次性全部加载到内存。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。
用的二分
全部代码
class IPParse @@data ||= [] def self.parse(ip) return false unless ip.to_s =~ /(\d+\.){3}\d+/ # 简单判断IP格式合法性(当然这样不能保证格式完全正确,实用中传入非法格式的可能性比较少,先这样吧) ip,addr = format(ip) , '' #格式化IP地址, 例: 1.4.45.123 格式化为 001.004.045.123 [ip[0,3].to_i,0].each do |f| # 先从IP首位命名的文件中查找,没有则从0.txt文件中查找, IP文件命名格式为 data/123.txt ... file = "#{File.dirname(__FILE__)}/../data/#{f.to_s}.txt" @@data[f] ||= File.exist?(file) ? File.new(file).to_a : false # 如果存在文件,缓存取出的文件 if @@data[f] addr = dichotomizing(@@data[f],ip) # 二分法查找 return addr if addr # 找到则返回此值 end end return "UNKNOW" end protected def self.dichotomizing(arg,ip) cen = arg.size/2 # 长度取中 center cur = arg[cen] # 中值 current, #格式类似 005.149.000.000 005.255.255.255 IANA #当只有一个元素时,(005.149.000.000..005.255.255.255) 是否包含IP return (cur[0,15]..cur[16,15]).include?(ip) ? cur[32...-1] : false if cen == 0 # 005.149.000.000(前面的IP) > IP 时取前一半 return dichotomizing(arg[0...cen],ip) if cur[0,15] > ip # 005.255.255.255(前面的IP) < IP 时取后一半 return dichotomizing(arg[cen..-1],ip) if cur[16,15] < ip # 如果 此值的前IP < IP < 此值的后IP,则返回此值 return arg[cen][32...-1] end def self.format(ip) ip.to_s.split('.').inject([]) do |s,x| s << x.rjust(3,'0') end.join('.') end end
速度过会上。
我试了下你的这个puts IPParse.parse('222.222.222.222')怎么找不到。而且我不喜欢打开一个文件不自己关闭它。我改成这样了,用的ruby1.9.1所以有最上面那行。不知道有没有什么BUG!
Encoding.default_external='UTF-8' require 'benchmark' class IPParse @@data ||= [] def self.parse(ip) raise 'WRONT IP ADDRESS' unless ip.to_s =~ /(\d+\.){3}\d+/ ip.to_s.split('.').each{|i| raise 'WRONT IP ADDRESS' if i.to_i>255 } ip= format(ip) [ip[0,3].to_i,0].each do |n| file="#{File.dirname(__FILE__)}/../data/#{n.to_s}.txt" @@data[n] ||= File.exist?(file) ? File.open(file){|f|f.to_a} : false if @@data[n] addr=dichotomizing(@@data[n],n == 0 ? ip : ip[4,ip.length]) return addr.strip if addr end end return "UNKNOW" end private def self.dichotomizing(arg,ip) size = arg.size cen = size/2 x=arg[cen].split(/\s+/,3) return dichotomizing(arg[0...cen],ip) if size != 1 && x[0] > ip return dichotomizing(arg[cen...size],ip) if size != 1 && x[1] < ip return x[0] <= ip && x[1] >= ip ? x[2] : false if size == 1 return x[2] end def self.format(ip) ip.to_s.split('.').inject([]) do |s,x| s << x.rjust(3,'0') end.join('.') end end def randip 4.times.inject([]) {|s,x| s << rand(255) }.join('.') end Benchmark.bm{|x| x.report{ 10000.times{ IPParse.parse(randip) } } }
16 楼
wosmvp
2009-02-19
上面的结果是测试1万个随机IP,每个IP测试10次的结果
15 楼
wosmvp
2009-02-19
结果:
~ $ ruby a.rb (纯真)
131.656655311584
~ $ ruby a.rb (IPParse)
28.8699994087219
~ $ ruby a.rb (纯真)
131.656655311584
~ $ ruby a.rb (IPParse)
28.8699994087219
14 楼
wosmvp
2009-02-19
上测试:
纯真IP查询 使用了 orlaa 朋友的
http://gist.github.com/66248
测试环境:
Linux myhost 2.6.28.2 #1 SMP PREEMPT Fri Jan 30 16:03:57 CST 2009 i686 AMD Turion(tm) 64 Mobile Technology MK-38(2.2GHz) AuthenticAMD GNU/Linux,1.5G内存
代码如下
纯真IP查询 使用了 orlaa 朋友的
http://gist.github.com/66248
测试环境:
Linux myhost 2.6.28.2 #1 SMP PREEMPT Fri Jan 30 16:03:57 CST 2009 i686 AMD Turion(tm) 64 Mobile Technology MK-38(2.2GHz) AuthenticAMD GNU/Linux,1.5G内存
代码如下
require 'rubygems' require 'ipparse' def search_ip_cz(ip) #IP数据文件路径 #ip='202.38.64.10' dat_path = "/home/mvp/Desktop/QQWry.Dat" #检查IP地址 # if not ip~=/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/ # return 'IP Address Error' # end fd = File.open(dat_path, "rb") ips = ip.split('.') ip_num = ips[0].to_i * 16777216 + ips[1].to_i * 65536 + ips[2].to_i * 256 + ips[3].to_i data_begin = fd.read(4) data_end = fd.read(4) ipbegin= data_begin.unpack('L').join('').to_i if ipbegin < 0 ipbegin += 2**32 end ipend= data_end.unpack('L').join('').to_i if ipend < 0 ipend += 2**32 end ip_allnum = (ipend - ipbegin) / 7 + 1 begin_num = 0 end_num = ip_allnum ip1_num=0 ip2_num=0 ip_addr1="" ip_addr2="" #使用二分查找法从索引记录中搜索匹配的IP记录 while ip1_num>ip_num or ip2_num<ip_num middle= ((end_num + begin_num) / 2).to_i #偏移指针到索引位置读取4个字节 fd.seek(ipbegin + 7 * middle) ip_data1 = fd.read(4) if ip_data1.length < 4 fd.close return 'System Error' end #提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂 ip1_num = ip_data1.unpack('L').join('').to_i if ip1_num < 0 ip1_num += 2**32 end #提取的长整型数大于我们IP地址则修改结束位置进行下一次循环 if ip1_num > ip_num end_num = middle redo end #取完上一个索引后取下一个索引 data_seek = fd.read(3) if data_seek.length < 3 fd.close return 'System Error'; end data_seek = (data_seek+0.chr).unpack('L').join('').to_i #data_seek = implode('', unpack('L', $data_seek.chr(0))); fd.seek(data_seek) ip_data2 = fd.read(4) if ip_data2.length<4 fd.close return 'System Error' end ip2_num = ip_data2.unpack('L').join('').to_i if ip2_num < 0 ip2_num += 2**32 end #没找到提示未知 if ip2_num < ip_num end if middle == begin_num fd.close return 'Unknown' end begin_num = middle end ip_flag = fd.read(1) if ip_flag == 1.chr ip_seek = fd.read(3) if ip_seek.length < 3 fd.close return 'System Error' end ip_seek = (ip_seek+0.chr).unpack('L').join('').to_i #implode('', unpack('L', $ip_seek.chr(0))); fd.seek(ip_seek) ip_flag = fd.read(1) end if ip_flag == 2.chr addr_seek = fd.read(3) if addr_seek.length < 3 fd.close return 'System Error' end ip_flag = fd.read(1) if ip_flag == 2.chr addr_seek2 = fd.read(3) if addr_seek2.length< 3 fd.close return 'System Error' end addr_seek2 =(addr_seek2+0.chr).unpack('L').join('').to_i# implode('', unpack('L', $addr_seek2.chr(0))); fd.seek(addr_seek2) else fd.seek(-1, IO::SEEK_CUR) end while (char = fd.read(1)) != 0.chr ip_addr2 += char# ip_addr2 .= char end addr_seek =(addr_seek+0.chr).unpack('L').join('').to_i#$addr_seek = implode('', unpack('L', $addr_seek.chr(0))); fd.seek(addr_seek) while (char = fd.read(1)) != 0.chr ip_addr1 += char#$ip_addr1 .= $char; end else fd.seek(-1, IO::SEEK_CUR) while ( char = fd.read(1)) != 0.chr ip_addr1 += char#ip_addr1 .= char; end ip_flag = fd.read(1) if ip_flag == 2.chr addr_seek2 = fd.read(3) if addr_seek2.length < 3 fd.close return 'System Error' end addr_seek2 = (addr_seek2+0.chr).unpack('L').join('').to_i#implode('', unpack('L', $addr_seek2.chr(0))); fd.seek(addr_seek2) else fd.seek(-1, IO::SEEK_CUR) end while (char = fd.read(1)) != 0.chr ip_addr2 += char# ip_addr2 .= char end end # fd.close #最后做相应的替换操作后返回结果 #if(preg_match('/http/i', $ip_addr2)) { # $ip_addr2 = ''; #} if (ip_addr2=~/http(\s|\S)/)!=nil ip_addr2 = '' end ip_addr = "#{ip_addr1} #{ip_addr2}" ip_addr.gsub!(/(\S|\s)*CZ88.(NET|Net)(\S|\s)*/,'')#$ip_addr = preg_replace('/CZ88.Net/is', '', $ip_addr); #$ip_addr = preg_replace('/^s*/is', '', $ip_addr); #$ip_addr = preg_replace('/s*$/is', '', $ip_addr); if (ip_addr=~/http(\s|\S)/)!=nil or ip_addr=="" ip_addr = 'Unknown' end # print ip_addr return ip_addr end def randip 4.times.inject([]) {|s,x| s << rand(255) }.join('.') end a = [] 10000.times { a << randip } c = 0 a.map {|x| 10.times{ t = Time.now # search_ip_cz(x) IPParse.parse(x) c += Time.now.to_f - t.to_f } } puts c
13 楼
wosmvp
2009-02-19
QuakeWang 写道
JavaEye的IP解析也是用纯真IP数据库查询算法写的,它比较快,而且数据格式比较小,小于10M,可以一次性全部加载到内存。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。
用的二分
全部代码
class IPParse @@data ||= [] def self.parse(ip) return false unless ip.to_s =~ /(\d+\.){3}\d+/ # 简单判断IP格式合法性(当然这样不能保证格式完全正确,实用中传入非法格式的可能性比较少,先这样吧) ip,addr = format(ip) , '' #格式化IP地址, 例: 1.4.45.123 格式化为 001.004.045.123 [ip[0,3].to_i,0].each do |f| # 先从IP首位命名的文件中查找,没有则从0.txt文件中查找, IP文件命名格式为 data/123.txt ... file = "#{File.dirname(__FILE__)}/../data/#{f.to_s}.txt" @@data[f] ||= File.exist?(file) ? File.new(file).to_a : false # 如果存在文件,缓存取出的文件 if @@data[f] addr = dichotomizing(@@data[f],ip) # 二分法查找 return addr if addr # 找到则返回此值 end end return "UNKNOW" end protected def self.dichotomizing(arg,ip) cen = arg.size/2 # 长度取中 center cur = arg[cen] # 中值 current, #格式类似 005.149.000.000 005.255.255.255 IANA #当只有一个元素时,(005.149.000.000..005.255.255.255) 是否包含IP return (cur[0,15]..cur[16,15]).include?(ip) ? cur[32...-1] : false if cen == 0 # 005.149.000.000(前面的IP) > IP 时取前一半 return dichotomizing(arg[0...cen],ip) if cur[0,15] > ip # 005.255.255.255(前面的IP) < IP 时取后一半 return dichotomizing(arg[cen..-1],ip) if cur[16,15] < ip # 如果 此值的前IP < IP < 此值的后IP,则返回此值 return arg[cen][32...-1] end def self.format(ip) ip.to_s.split('.').inject([]) do |s,x| s << x.rjust(3,'0') end.join('.') end end
速度过会上。
12 楼
wosmvp
2009-02-19
欢迎一切符合自己应用的修改,
纯真版代码太长,这个版本30行代码都不到,也挺快挺好用
纯真版代码太长,这个版本30行代码都不到,也挺快挺好用
11 楼
QuakeWang
2009-02-19
JavaEye的IP解析也是用纯真IP数据库查询算法写的,它比较快,而且数据格式比较小,小于10M,可以一次性全部加载到内存。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。
wosmvp可以谈你一下你的算法吗?做一个2者对比性能测试看看。
10 楼
wosmvp
2009-02-19
orange0513 写道
二分查找代码return dichotomizing(arg[0...cen],ip) if size != 1 && (arg[cen] > ip + '1')
这块好像有bug
IPParse.parse('59.1.32.220')到最后就死循环
这块好像有bug
IPParse.parse('59.1.32.220')到最后就死循环
这个版本早过时了
9 楼
wosmvp
2009-02-19
orlaa 写道
http://read.pudn.com/downloads74/sourcecode/windows/file/268981/ip_searcher.rb__.htm
IP数据库 纯真版 是能在linux中使用的,上面的地址是刚找到的一段测试代码,将
def search_ip_cz(ip) 剥离出来便能正常在linux系统下正常使用了,
http://lumaqq.linuxsir.org/article/qqwry_format_detail.html这篇文章是LumaQQ作者写的"纯真IP数据库格式详解"
IP数据库 纯真版 是能在linux中使用的,上面的地址是刚找到的一段测试代码,将
def search_ip_cz(ip) 剥离出来便能正常在linux系统下正常使用了,
http://lumaqq.linuxsir.org/article/qqwry_format_detail.html这篇文章是LumaQQ作者写的"纯真IP数据库格式详解"
非文本修改起来比较麻烦……呵呵
8 楼
orlaa
2009-02-18
7 楼
不见得
2009-02-18
<p>嗯 , 是我使用的问题 , 我终端都是 gbk的, 还得转那么一下 :</p>
<p> </p>
<pre name="code" class="ruby">Iconv.conv('gbk','utf-8',IPParse.parse('218.58.88.175')) </pre>
<p> </p>
<p> </p>
<p>貌似纯真的库数据量很大 http://www.cz88.net/<br />有个ruby的版本 http://www.51dir.com/thread-203-1-1.html<br />但是有些问题 , 还有个对这个的hack版 , google 下就能找到 。</p>
<p> </p>
<p> </p>
<p>一个小建议:</p>
<p> </p>
<pre name="code" class="ruby"> def self.parse(ip , to = 'utf-8')</pre>
<p>haha , 这样我用着就更方便了</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<pre name="code" class="ruby">Iconv.conv('gbk','utf-8',IPParse.parse('218.58.88.175')) </pre>
<p> </p>
<p> </p>
<p>貌似纯真的库数据量很大 http://www.cz88.net/<br />有个ruby的版本 http://www.51dir.com/thread-203-1-1.html<br />但是有些问题 , 还有个对这个的hack版 , google 下就能找到 。</p>
<p> </p>
<p> </p>
<p>一个小建议:</p>
<p> </p>
<pre name="code" class="ruby"> def self.parse(ip , to = 'utf-8')</pre>
<p>haha , 这样我用着就更方便了</p>
<p> </p>
<p> </p>
<p> </p>
6 楼
orange0513
2009-02-18
二分查找代码return dichotomizing(arg[0...cen],ip) if size != 1 && (arg[cen] > ip + '1')
这块好像有bug
IPParse.parse('59.1.32.220')到最后就死循环
这块好像有bug
IPParse.parse('59.1.32.220')到最后就死循环
5 楼
orlaa
2009-02-18
http://read.pudn.com/downloads74/sourcecode/windows/file/268981/ip_searcher.rb__.htm
IP数据库 纯真版 是能在linux中使用的,上面的地址是刚找到的一段测试代码,将
def search_ip_cz(ip) 剥离出来便能正常在linux系统下正常使用了,
http://lumaqq.linuxsir.org/article/qqwry_format_detail.html这篇文章是LumaQQ作者写的"纯真IP数据库格式详解"
IP数据库 纯真版 是能在linux中使用的,上面的地址是刚找到的一段测试代码,将
def search_ip_cz(ip) 剥离出来便能正常在linux系统下正常使用了,
http://lumaqq.linuxsir.org/article/qqwry_format_detail.html这篇文章是LumaQQ作者写的"纯真IP数据库格式详解"
4 楼
wosmvp
2009-02-18
<div class="quote_title">不见得 写道</div>
<div class="quote_div">
<p>免费测试一下 ,编码似乎有些问题 ,都显示不出来,是不是要检查一下当前系统的编码呢 ?</p>
<p> </p>
<p> </p>
<p>windowsxp 和 linux 都是</p>
<p>而且 linux 的 LANG=en_US.UTF-8 或者 zh_CN.utf8 都不成哦, 上图 , 仅供参考 :)<br /><img src="/upload/attachment/76484/b645ee29-cfc7-3408-9bb5-339fa9ece863.jpg" alt="" /><br /> <br /><img src="/upload/attachment/76486/60a805a6-d299-3d34-ab48-d0626741b2da.jpg" alt="" /></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
</div>
<p>IP文本格式是UTF8的,GBK有乱码正常,</p>
<p>UTF-8 乱码? 上张 Linux . UTF-8 乱码截图看看?</p>
<p> </p>
<p>检查一下当前系统的编码,速度必然降低,写这个Gem开始是想用在web应用中,如果想用GBK编码,先下载PHPWind的GBK编码的ipdata文件,再使用lib目录下的convert_ip_format.rb转换格式(可能需要修改此文件,例如去掉dos2unix等),将它们复制到data目录就行</p>
<p> </p>
<p> </p>
<p>--------------</p>
<p>IP数据库 纯真版 ? 没试过,好像不可以在Linux中使用吧?</p>
<div class="quote_div">
<p>免费测试一下 ,编码似乎有些问题 ,都显示不出来,是不是要检查一下当前系统的编码呢 ?</p>
<p> </p>
<p> </p>
<p>windowsxp 和 linux 都是</p>
<p>而且 linux 的 LANG=en_US.UTF-8 或者 zh_CN.utf8 都不成哦, 上图 , 仅供参考 :)<br /><img src="/upload/attachment/76484/b645ee29-cfc7-3408-9bb5-339fa9ece863.jpg" alt="" /><br /> <br /><img src="/upload/attachment/76486/60a805a6-d299-3d34-ab48-d0626741b2da.jpg" alt="" /></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
</div>
<p>IP文本格式是UTF8的,GBK有乱码正常,</p>
<p>UTF-8 乱码? 上张 Linux . UTF-8 乱码截图看看?</p>
<p> </p>
<p>检查一下当前系统的编码,速度必然降低,写这个Gem开始是想用在web应用中,如果想用GBK编码,先下载PHPWind的GBK编码的ipdata文件,再使用lib目录下的convert_ip_format.rb转换格式(可能需要修改此文件,例如去掉dos2unix等),将它们复制到data目录就行</p>
<p> </p>
<p> </p>
<p>--------------</p>
<p>IP数据库 纯真版 ? 没试过,好像不可以在Linux中使用吧?</p>
3 楼
不见得
2009-02-18
<p>免费测试一下 ,编码似乎有些问题 ,都显示不出来,是不是要检查一下当前系统的编码呢 ?</p>
<p> </p>
<p> </p>
<p>windowsxp 和 linux 都是</p>
<p>而且 linux 的 LANG=en_US.UTF-8 或者 zh_CN.utf8 都不成哦, 上图 , 仅供参考 :)<br /><img src="/upload/attachment/76484/b645ee29-cfc7-3408-9bb5-339fa9ece863.jpg" alt="" /><br /> <br /><img src="/upload/attachment/76486/60a805a6-d299-3d34-ab48-d0626741b2da.jpg" alt="" /></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>windowsxp 和 linux 都是</p>
<p>而且 linux 的 LANG=en_US.UTF-8 或者 zh_CN.utf8 都不成哦, 上图 , 仅供参考 :)<br /><img src="/upload/attachment/76484/b645ee29-cfc7-3408-9bb5-339fa9ece863.jpg" alt="" /><br /> <br /><img src="/upload/attachment/76486/60a805a6-d299-3d34-ab48-d0626741b2da.jpg" alt="" /></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
2 楼
orlaa
2009-02-18
现在的IP数据库是文本的, 能否换成 "IP数据库 纯真版"的呢?
1 楼
wosmvp
2009-02-18
昨天版本10万随机IP时间为 52.5233330726624 秒
今天版本10万随机IP时间为 28.3033330440521秒
速度提升 46.1 % !
安装:
$ sudo gem install ipparse
今天版本10万随机IP时间为 28.3033330440521秒
速度提升 46.1 % !
安装:
$ sudo gem install ipparse
相关推荐
1. **IP地址输入**:用户可以直接输入IP地址进行查询。 2. **自动识别**:工具可能具备自动识别输入是否为IP地址的功能,避免用户输入错误。 3. **地理定位**:利用纯真IP数据库,将IP地址转换为具体的地理位置信息...
总结来说,Java中根据IP获取国家和地区名称涉及的技术点包括:使用`InetAddress`处理IP地址、理解IP地址库的结构和查询机制、以及选择和使用合适的第三方库或服务进行IP定位。在实际应用中,应确保IP库的及时更新,...
3. **查询IP地址**:在解析库的帮助下,我们可以输入一个IP地址,通过二分查找等高效算法,快速定位到该IP地址在数据库中的记录。记录通常包括起始IP、结束IP以及对应地理位置的信息。 4. **提取地理位置信息**:...
试题中涉及的知识点主要集中在IP地址的解析、子网掩码的运用以及网络地址、主机地址、广播地址的计算。 1. IP地址结构:IP地址由32位二进制组成,通常分为四部分,每部分用点分十进制表示,如154.27.0.0。IP地址...
2. **IP库查询**:使用预构建的IP地址数据库,如MaxMind的GeoLite,进行查询。这些数据库会定期更新以保持准确。 3. **API服务**:如Google Maps Geocoding API或OpenStreetMap Nominatim等,可以提供IP地址的地理...
本次设计的目标是捕获网络中...2)在标准输出和日志文件写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。
在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容,当程序接收到键盘输入Ctrl+C时...
设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。 本实验的目标是捕获网络中的IP数据包,解析数据包的内容,见个结果显示在标准输出...
2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。 3)能够解析不同协议...
通过这个数据库,我们可以快速查询到一个IP地址所属的地理位置。首先,你需要从互联网上下载最新版本的纯真IP数据库,通常以SQL或文本格式提供。 在Java中,我们可以创建一个类来处理IP解析。以下是一个简单的...
在`ipparse`函数中,代码首先通过`*(IP_HEADER*)buffer`将缓冲区中的数据转化为`IP_HEADER`结构体,然后依次调用上述函数来解析并打印出每个字段的值。这一步骤是实现IP数据包解析的核心。 ### 结论 通过上述分析...
9. 源IP地址(Source IP Address)和目的IP地址(Destination IP Address):各32位,标识发送方和接收方的网络地址。 10. 可选字段(Options):根据首部长度字段,可能存在的可选字段,用于扩展功能。 在C语言中...
这通常涉及到DNS反向查询,将IP地址映射回其对应的组织或运营商。这对于网站统计、网络安全分析、地理位置服务等应用非常有用。例如,你可以使用这个库来识别访问你网站的用户可能来自哪个网络服务提供商,或者在...
头部包含了控制信息,如版本号、头部长度、服务类型(TOS)、总长度、标识符、标志、片段偏移、生存时间(TTL)、协议类型、头部校验和以及源和目的IP地址。数据部分则携带上层协议(如TCP、UDP或ICMP)的数据。 2...
- 输出并记录IP包头的关键信息,包括版本、头长度、服务类型(TOS)、总长度、标识符、标志、片段偏移、生存时间(TTL)、上层协议类型、头校验和、源IP地址和目标IP地址等。 - 提供一个优雅的退出机制,例如在接收...
1. **了解IP数据包的基本结构**:包括版本号、头部长度、服务类型、总长度、标识、标志、片段偏移、生存时间(TTL)、协议类型、头部校验和、源IP地址、目的IP地址等。 2. **理解IP协议的工作原理**:包括IP数据包在...
- **源IP地址和目的IP地址**: 各32位,分别表示发送方和接收方的IP地址。 - **选项字段和填充字段**: 可选字段,用于携带额外的信息或对齐。 2. **IP协议**: - **功能**: IP协议负责在网络层将数据从源节点传递...
2)在标准输出和日志文件中写入捕获的IP包的版本、头长度、服务类型、数据包总长度、数据包标识、分段标志、分段偏移值、生存时间、上层协议类型、头校验和、源IP地址和目的IP地址等内容。 3)当程序接收到键盘输入...