第2个回答 2010-03-11
原来是这样啊(下次提问请一次性提供所有与问题相关的可提供内容),你可用记事本(或者其它工具)打开这个文件,看看内部的结构,然后自己写一个读取函数,这只是个数据文件,没有接口函数.
****************************************
如果有接口函数的话当然可以.
*****************************************
所谓的IP基准应该是一些IP地址段,例如:
192.168.*.* 本地
这样的话,只要读取一个IP地址,用strcmp()函数与基准对比一下,看看IP地址前几段是否与对应的基准相同,如果相同,就是对应地区的IP地址.
不知是否明白?
或者给出一个具体的分类方法和所谓的IP基准库,以便得出更详细的算法实现.
第4个回答 2010-03-11
基准库是什么样子的?
不要用strcmp,效率太差了,将Ip地址转换成32位整数,将基准库中的IP段也转换成32位整数
给你举个例子, 下面的程序判断 IP1 和 IP2 是否落在192.168.0.0~192.168.255.255 范围内。 使用到了 inet_aton() 和 ntohl() 两个库函数,我的头文件引用声明是在linux下的,不知道VC上该引什么头文件,你看一下msdn里的帮助就知道了。
你可以参考我这个程序,首先把IP基准库里的IP范围都度进来并且转换成整数放在一个数组中,然后开始读取txt文件,每读一个,转一个成整数,然后和基准库数组里的范围进行比较,然后统计,这样最方便。
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
void main()
{
const char *IP1 = "192.168.100.1";
const char *IP2 = "192.169.200.55";
const char *range1 = "192.168.0.0";
const char *range2 = "192.168.255.255";
unsigned int left, right, ip;
struct in_addr addr;
inet_aton(range1, &addr);
left = ntohl(addr.s_addr);
inet_aton(range2, &addr);
right = ntohl(addr.s_addr);
inet_aton(IP1, &addr);
ip = ntohl(addr.s_addr);
if (ip >= left && ip <= right)
printf("%s is inside %s-%s\n", IP1, range1, range2);
else
printf("%s is NOT inside %s-%s\n", IP1, range1, range2);
inet_aton(IP2, &addr);
ip = ntohl(addr.s_addr);
if (ip >= left && ip <= right)
printf("%s is inside %s-%s\n", IP2, range1, range2);
else
printf("%s is NOT inside %s-%s\n", IP2, range1, range2);
}