追捕文件WRY.DLL的浅显分析及程序示例

原创 2002年07月29日 09:02:00

大家都知道wry.dll这个文件吧,它就是一张全球的IP地址分配表,里边有IP地址对应的地理位置,利用这张表,可以轻松的根据你知道的IP查到它的地址位置.它虽然定义成了一个DLL文件,但是实际上它是一个数据库,这篇文章就是告诉大家它的结构,并且写一个查询的程序例子.如果你已经知道了,或者不屑知道这么简单的玩艺,呵呵,请离开.^_^

程序的主要思路很简单,根据IP或者HOST来逐条比较每条WRY.DLL中的数据,若符合条件,则显示信息.此程序必须有WRY.DLL文件.

wry.dll由若千条记录组成,既然是记录,那么它就有其结构,实际上每一条记录包含5个字段,分别是STARTIP(17),ENDIP(17),COUNTRY(16),LOCAL(54),THANK(23),括号里边的是该字段的长度,以字节为单位.各个字段的含义如下:

STARTIP: 一个IP地址段的起始地址
ENDIP:  一个IP地址段的终止地址
COUNTRY: 该地址段所在的国家
LOCAL:  该地址段所在的国家的具体位置
THANK:  此项信息的提供者

好了,既然知道了记录的结构,那么我们就可以定义它的数据结构如下:

struct _wry{
 char startip[17];
 char endip[17];
 char country[16];
 char local[54];
 char thank[23];
 };

接下来,知道了这个最重要的信息,我们就可以编写程序来根据IP或者是host来显示信息了.

但是,字符串的IP地址长度最长为15(xxx.xxx.xxx.xxx),而为什么记录中的startip和endip的长度都定义成17了呢?如果呢编写简单的程序来测试一些就知道,这两个字段的第一个字符都为空格,最后一个字符为NULL,真正的地址是从第二个字符开始的,即&(startip[1]),认识到这一点也非常重要.

此外,每条记录中的IP字符串长度都为15,即是11.123.11.2形式的IP串在里边的形式为011.123.011.002,那么如果不将要查询的IP串进行转化,比较起来就比较麻烦,因此需要由一个函数将IP串转化成15长度的标准格式.

还有,WRY.DLL文件中不是所有的记录都是如上的结构,特殊的就是第一个记录,经过测试,得知它的长度是320-128=192,而其它的所有记录的长度均为128.

最后一个问题就是如果单纯的这样查询比较:if(startip < 查询的i <endip) 打印信息,那么就可能显示除若干条,因为里边的IP并不是非常严格的.

好了,所有的需要注意的地方都提到了,下边就开始写程序吧.
写好的代码如下:
**********************************************************************************************
file://in wry.dll,the startip and endip format is :[ 000.000.000.000 ]
file://len = 17,and the first is BLANK and the last is NULL

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

struct _wry{
 char startip[17];
 char endip[17];
 char country[16];
 char local[54];
 char thank[23];
 };

struct _wry *wry;

char str[320];
char temp[16];
struct _wry maxw[10];
int  count = 0;

char* convertip(const char* ip)
{
 char *temp2;
 int i,j;

 strcpy(temp,"000.000.000.000");
 temp2 = (char*)malloc(strlen(ip));
 strcpy(temp2,ip);

 j = strlen(temp2);
 for( i =0 ; i < j; i++)
  if(temp2[i] == '.')
   temp2[i] = '/0';

 for(i = 0; i < 4; i++)
 {
  strncpy(&temp[i*4+3-strlen(temp2)],temp2,strlen(temp2));
  temp2 += strlen(temp2) +1;
 }

 return temp;
}

int do_dis(const char *ip)
{
 
 if(strncmp(&(wry->endip [1]),ip,strlen(ip)) <= 0)
  return 0;

 if(strncmp(&(wry->startip [1]),"000.000.000.000",15) == 0)
  return 0;

 if(strncmp(&(wry->startip [1]),ip,strlen(ip)) <= 0)
  memcpy(&maxw[count++],wry,sizeof(struct _wry));
  
 return 1;

}

void main(int argc,char **argv)
{
 WSADATA  wsd;
 struct hostent *h = NULL;
 FILE * fp = NULL;
 int i = 0;
 char cip[16];

 if(argc != 2)
 {
  printf("usage %s [ip | host]/n",argv[0]);
  return;
 }

 if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
  return;
 if(inet_addr(argv[1]) == INADDR_NONE)
 {
  if((h = gethostbyname(argv[1])) != NULL)
   strcpy(cip,inet_ntoa(*(struct in_addr*)h->h_addr));
  else
  {
   printf("resolve host to ip failed/n");
   return;
  }
 }
 else
  strcpy(cip,argv[1]);
 convertip(cip);
 printf("/n****************************************************/n");
 printf("convert ip: %s/n",temp);

 if((fp = fopen("wry.dll","r")) == NULL)
 {
  printf("can not open file!");
  exit(0);
 }

 while(!feof(fp))
 {

  if( i == 0)
  {
   if(fread(str,sizeof(str) - 128,1,fp) != 1)
   {
    printf("read file error/n");
    exit(0);
   }
   else
    i = 1;

   continue;
  }
  else
   if(fread(str,128,1,fp) != 1)
   {
    file://read end of file
   }

  wry = (struct _wry*)str;
 
  wry->thank [23] = '/0';
  wry->local [53] = '/0';
  wry->country [15] = '/0';
  wry->endip [16] = '/0';
  wry->startip [16] = '/0';
  
  do_dis(temp);
   
 }

 fclose(fp);
 WSACleanup();

 if(count == 0)
  printf("not match found!/n");
 else
 {
  printf("found %d match,and the best match as follows:/n",count);
  printf("==========================/n");
  printf("startip:%s/n",maxw[--count].startip );
  printf("endip:%s/n",maxw[count].endip );
  printf("country:%s/n",maxw[count].country );
  printf("local:%s/n",maxw[count].local );
  printf("****************************************************/n/n");
 }

}
***********************************************************************************************
此程序在windows 2000 和VC6.0下编译通过,编译好的程序和代码,以及WRY.DLL文件可以在地址

http://blldw.myetang.com/vc/hunt.zip下载.

感谢你看到了最后!^_^.
any problem please mailto: mrh123@etang.com.
        

                                                                                               2002.7.28

 

 

 

 


 

NOI2007.Day2.T3.追捕盗贼

这道题是看的郑暾大牛的论文《平衡思想》 里面说这道题是树的Search Number问题,有O(n)解法,恰好我这里有数据&标程,一看标程8.5k…… 郑暾大牛给出了一种DP构造解 虽然不是...
  • OrpineX
  • OrpineX
  • 2011年12月17日 10:10
  • 1221

微信小程序官方示例

微信小程序官方示例 下载微信客户端版本号:6.3.27 及以上,只有小程序绑定的开发者有权限扫码体验。下载源码 版本20161010...
  • wds1181977
  • wds1181977
  • 2016年11月07日 14:52
  • 502

线程池的浅显分析

深入研究线程池一.什么是线程池?线程池就是以一个或多个线程[循环执行]多个应用逻辑的线程集合.注意这里用了线程集合的概念是我生造的,目的是为了区分执行一批应用逻辑的多个线程和线程组的区别.关于线程组的...
  • guoli_2011
  • guoli_2011
  • 2011年01月26日 10:56
  • 181

三层的浅显分析

 理论太抽象,先会做了在去理解  引言:本文不是从理论的角度来探讨三层架构,而是用一个示例来介绍如何建设一个三层架构的项目,并说明项目中各个文件所处的层次与作用。写本文的目的,不是为了说明自己的...
  • jaylongli
  • jaylongli
  • 2009年11月16日 17:07
  • 439

大数据系统的浅显易懂理解

我暂且就按照一个由远及近的顺序,按照时间的早晚从大数据出现之前的时代讲到现在。暂时按一个城市来比喻吧,反正Landscape的意思也大概是”风景“的意思。 早在大数据概念出现以前就存在了各种各样的关...
  • u011487593
  • u011487593
  • 2015年08月02日 14:57
  • 706

疯狂JAVA讲义---第十二章:Swing编程(四)Applet和JApplet

虽然现在已经不是Applet的时代了,applet过于强大导致客户端的不安全性,还要求客户端安装JAVA运行环境,flash已经成为web应用的主流,现在每个游览器基本都安装了flash播放器,但Ap...
  • terryzero
  • terryzero
  • 2009年01月15日 20:54
  • 3800

WSDL文件示例

WSDL文件示例  让我们来研究一下WSDL文件,看看它的结构,以及如何工作。请注意这是一个非常简单的WSDL文档实例。我们的意图只是说明它最显著的特征。以下的内容中包括更加详细的讨论。 ...
  • neubuffer
  • neubuffer
  • 2013年11月23日 14:39
  • 664

从3个程序理解C++类实例大小

程序1: #include using namespace std; class a{}; class b{}; class c:public a{ virtual void fun()=0; ...
  • xyw_Eliot
  • xyw_Eliot
  • 2014年02月20日 21:27
  • 1014

分析exe文件结构

分析exe文件结构 转自: http://blog.csdn.net/xiaofengcanyuexj/article/details/37697577 一、EXE文件概念 ...
  • DemonDe
  • DemonDe
  • 2016年12月19日 22:30
  • 1351

追捕

 [日]西村寿行
  • ddkiller
  • ddkiller
  • 2007年11月17日 13:42
  • 248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:追捕文件WRY.DLL的浅显分析及程序示例
举报原因:
原因补充:

(最多只允许输入30个字)