C语言如何实现IP分类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言如何实现IP分类相关的知识,希望对你有一定的参考价值。
现有TXT文档,内存放有上千万IP地址,按一行一个存放。现要按IP基准库(IP基准库可任选)对其内所有IP进行分类,只要按基准库统计出此TXT文档内每个国家对应的IP数目即可。
用C语言怎么编程实现?
拜托各位大大指点下思路~~
回一楼:首先3Q~~,“只要读取一个IP地址,用strcmp()函数与基准对比一下”,关键那些IP段太多了,怎么逐个对比?难道要每个段都输入进去?不能调用基准库的接口函数之类的吗?
回一楼2:
找不到接口函数,也不知道怎么用...
我找了个纯真IP数据库,里面有个“QQWry.dat”的文件,不知道咋用
谢谢各位的热心回答,4楼的算法不错,但是那个IP库的数据改不了,地址段也不连续,我现在是找了个源代码。直接调里面的函数,得到对应IP的国家,然后再于国家列表匹配,计算出每个国家的IP数,已经实现了,就是有点慢。
还得优化下,争取快一点~~
PS:前面跟lwlwwzc兄在百度Hi上请教了好一会,l兄不厌其烦的为我指点,分数给l兄吧~
再次感谢各位~
****************************************
如果有接口函数的话当然可以.
*****************************************
所谓的IP基准应该是一些IP地址段,例如:
192.168.*.* 本地
这样的话,只要读取一个IP地址,用strcmp()函数与基准对比一下,看看IP地址前几段是否与对应的基准相同,如果相同,就是对应地区的IP地址.
不知是否明白?
或者给出一个具体的分类方法和所谓的IP基准库,以便得出更详细的算法实现. 参考技术C 考虑使用正则表达式 参考技术D 基准库是什么样子的?
不要用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);
IP地址的分类——a,b,c 类是如何划分的
现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0。地址格式为:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址。
IP地址类型
最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。
1. A类IP地址
一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。
2. B类IP地址
一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。
3. C类IP地址
一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。
4. D类地址用于多点广播(Multicast)。
D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。
5. E类IP地址
以“llll0”开始,为将来使用保留。
全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。
在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:
A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255
A类地址的第一组数字为1~126。注意,数字0和 127不作为A类地址,数字127保留给内部回送函数,而数字0则表示该地址是本地宿主机,不能传送。
B类地址的第一组数字为128~191。
C类地址的第一组数字为192~223。
1. A类地址
A类地址的表示范围为:0.0.0.0~126.255.255.255,默认网络掩码为:255.0.0.0;A类地址分配给规模特别大的网络使用。A类网络用第一组数字表示网络本身的地址,后面三组数字作为连接于网络上的主机的地址。分配给具有大量主机(直接个人用户)而局域网络个数较少的大型网络。例如IBM公司的网络。
2. B类地址
B类地址的表示范围为:128.0.0.0~191.255.255.255,默认网络掩码为:255.255.0.0;B类地址分配给一般的中型网络。B类网络用第一、二组数字表示网络的地址,后面两组数字代表网络上的主机地址。
3. C类地址
C类地址的表示范围为:192.0.0.0~223.255.255.255,默认网络掩码为:255.255.255.0;C类地址分配给小型网络,如一般的局域网和校园网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。C类网络用前三组数字表示网络的地址,最后一组数字作为网络上的主机地址。
实际上,还存在着D类地址和E类地址。但这两类地址用途比较特殊,在这里只是简单介绍一下:D类地址称为广播地址,供特殊协议向选定的节点发送信息时用。E类地址保留给将来使用。
以上是关于C语言如何实现IP分类的主要内容,如果未能解决你的问题,请参考以下文章
linux 如何调出上网历史记录(用IP分类,因为有多个ip)用程序实现