捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:QQ IP数据库读取unit和示例代码
2cc070112 37027 2009/3/30 14:10:35
收藏了,谢谢
2cc070112 37026 2009/3/30 14:08:55
先收仓,谢谢
coldwind8112 17125 2005/8/22 14:56:04
  此东东已经更新上传了,正在审核中……,马上有更新版下载,审核通过后将马上在此贴出地址。
  更新了以下几点:
  ①大大加快读取速度(在大量的循环中尤其明显)
  ②地区查IP
  ③IP地址段查IP
  ④解压成文本文件(一般情况下可以在3秒内完成)
  若本程序能给您的工作带来帮助,请留言支持一下,我将十分感谢!
coldwind8112 16982 2005/8/15 16:29:57
此东东即将更新,尽情留意!即将推出新版本!更多功能!更快速度!
yumato 14349 2005/4/26 14:24:29
搞什么啊,明知我是菜鸟,怎没地区查IP啊,这个最重要了,我不会啊  5555555555
hongsing 14154 2005/4/20 14:55:18
感谢无私奉献,比偶写的快多了。
yuzi 14042 2005/4/16 0:51:06
谢谢冷风!
下载的人好像挺多的嘛,怎么就没人讨论一下呢?晕~~~~~~~~~~
coldwind8112 14035 2005/4/15 21:06:10
关于FileStream慢的问题正在想更好的办法,当前就发现太慢,但一时没有更好的办法……
coldwind8112 14034 2005/4/15 21:03:09
在<=中的=情况发生的前提条件就是整个二分法查询到IPRecordFrom和IPRecordTo为同一条记录,因此只要满足我修正后的条件应该就没有问题了

这样写更清楚一点
if (IPRecordFrom=IPRecordTo) or ((IPValue>=CompareIPValue1) and (IPValue<CompareIPValue2)) then begin
yuzi 13970 2005/4/13 12:50:49
晕,or 前面两个加个括号就可以了。。。
另外,假设以后最后一条记录IP段变成 255.255.255.255 - 255.255.255.255 时
这样是不是找不到最后那条条记录了呢?因为(IPValue<CompareIPValue2)将始终为假,
我觉得应该把“<”改为“<=”才行,是吗?
yuzi 13969 2005/4/13 12:27:56
to coldwind8112:
刚才没有试,现在试了一下,发现你的方法也是不行的,查询结果是错误的,
255.255.255.0 -- 255.255.255.255 IP段地址信息应该是:
纯真网络 2005年4月5日IP数据
yuzi 13967 2005/4/13 12:16:55
突然想到上面的方法只能图一时之利,以后QQWry.dat如果在
255.255.255.0 -- 255.255.255.255之间增加了IP记录,就会定位错误了。。。呵呵
yuzi 13963 2005/4/13 11:24:34
还有就是使用TFileStream流读取数据太慢了,
我模仿其它工具遍历导出IP库到Text文件,用了10秒左右(而且我是用文件映射的方式写文本文件的,如果是用textFile => Writeln()写的那就要20秒以上了,
不知道谁有更快的方法或改写过的TFileStream,Mail我一份,谢谢!
biout@126.com
yuzi 13962 2005/4/13 11:17:05
对于那个Bug,我是这样改的(主要是觉得这样可以减少循环判断):
在这句前面加条件:
  Result := SearchIPRecordID(1, GetRecordCount, ipVal);
变成(其实就是最后一条记录,请大家看一下行不行:):
  if  ipVal > 4294967039 then //即 4294967039 = GetIPValue('255.255.254.255')的值。
   Result := GetRecordCount
  else
   Result := SearchIPRecordID(1, GetRecordCount, ipVal);
 
对于跟Inet_Addr()函数返回值不同的问题,我对比了一下以后,我觉得可能是创造QQwry数据库的作者对分点式IP高低位理解相反所致。。。
coldwind8112 13960 2005/4/12 21:45:44
有什么疑问或BUG请大家提出,共同学习提高
您的留言就是我的动力
coldwind8112 13959 2005/4/12 21:43:31
回答yuzi关于GetIPValue(IP: string): Cardinal;
目的正如yuzi所说的取点分IP的数值型IP值的
没有用Inet_addr()函数,是因为嘿嘿不好意思 不知道有这个函数
至于结果为什么不一样这就有点奇怪了,我没有测试过不过IP地址的点分形式只是为了写法上方便,其实就是一个32位的整数值罢了,将点分形式的每部分转化为2进制拼合就行了
coldwind8112 13958 2005/4/12 21:38:35
问题解决,请下载的朋友们自行修改 untQQWry.pas


//找到了
    if (IPValue>=CompareIPValue1) and (IPValue<CompareIPValue2) then begin

修改为
//找到了
    if (IPRecordFrom=IPRecordTo) or (IPValue>=CompareIPValue1) and (IPValue<CompareIPValue2) then begin
coldwind8112 13957 2005/4/12 21:23:50
yuzi提出的程序中的BUG已经找到,主要是由于255.255.255.1 -- 255.255.255.255这一段记录恰好是最好一条记录,在进行二分法查找的时候要和邻近的记录(即下一条记录)进行比对时发生了溢出造成的。正在修改中……
coldwind8112 13950 2005/4/12 15:38:08
函数都是我写的 与原作者无关 我只是根据网上的一些QQ格式代码做了一个DELPHI版本的工具 yuzi提出的问题我也发现了 研究中……
yuzi 13912 2005/4/11 12:03:41
当IP是从 255.255.255.1 -- 255.255.255.255 的某一字串时,会出现“Stack overflow” 错误!
还有问一下:
GetIPValue(IP: string): Cardinal;函数是取点分IP的数值型IP值的吗?
如果是的话,为什么不用Inet_addr()函数转化呢?而且发现GetIPValue的转化结果竟然跟Inet_addr()不一样!!!不知道创建QQwry数据格式的作者是怎么想的?
我没有深入地去看代码,说的不对的地方请见谅。
第一页 上一页 下一页 最后页 有 23 条纪录 共2页 1 - 20
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号 更新RSS列表