使用C语言制作简单的IP扫描器

来源:互联网 发布:php试题库管理系统 编辑:程序博客网 时间:2024/05/07 00:03

上一篇帖我们讲过如何用C语言实现ping操作,下面我们讲解如何使用C制作一个简易的IP扫描器。


因为公网IP太多,所以我们只讲解如何制作一个内网的扫描器

制作前,我们要知道IP的分类,IPV4协议中有5类IP。这些IP中有些IP保留作为私网IP,也就是局域网IP,除去私网IP都是公网IP。以下为私网IP段

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


上次我们用system("ping 192.168.0.1")命令检测了IP是否能ping通,但是默认的ping命令会ping四次,加上超时的时执行时间太长,我们使用下面改良版的命令让他只ping一次,1000ms未相应就判定超时(具体超时时间可根据网络状况改变,例如内网普遍在100ms内即可设置成100)

ping 192.168.0.1 -n 1 -w 1000


然后我们要思考如何不断变换ip生成这个命令,我们可以使用for循环,每层循环都让一个人数字从1加到255,再对每层数字进行判断是否是一个内网IP,不是就continue进行下一次循环让数值加一



然后使用itoa将数字转换为字符串,再用strcat将字符串拼接起来



最后执行命令,如果成功就把ip地址以附加方式(a+)写到当前目录下的ping.txt文件中并清除ml中字符串准备下一次循环




以下是源码

#include#include#includeint main(void){int i1, i2, i3, i4, ok;char c1[30], c2[30], c3[30], c4[30], ping[100] = "ping ", d[30] = ".", ml[30] = "", fj[100] = " -n 1 -w 1000";FILE *fp;for (i1 = 1; i1 <=255; i1++){if (i1 == 10 || i1 == 172 || i1 == 192){for (i2 = 0; i2 <=255; i2++){if (i1 == 172){if (i2 < 16 || i2 > 31){continue;}}if (i1 == 192){if (i2 != 168){continue;}}for (i3 = 0; i3 <=255; i3++){for (i4 = 0; i4 <=255; i4++){itoa(i1, c1, 10);itoa(i2, c2, 10);itoa(i3, c3, 10);itoa(i4, c4, 10);strcat(ml, ping);strcat(ml, c1);strcat(ml, d);strcat(ml, c2);strcat(ml, d);strcat(ml, c3);strcat(ml, d);strcat(ml, c4);strcat(ml, fj);ok = system(ml);if (0 == ok){memset(ml, 0, sizeof(ml));strcat(ml, c1);strcat(ml, d);strcat(ml, c2);strcat(ml, d);strcat(ml, c3);strcat(ml, d);strcat(ml, c4);fp = fopen("ping.txt", "a+");fprintf(fp, "\n%s", ml);fclose(fp);}memset(ml, 0, sizeof(ml));}system("cls");}}}}    return 0;}

注意:源码的名字一定不能取成ping等系统关键程序名,否则编译成exe后执行会出现异常



写在后面的话

此程序还有很多地方需要完善,比如可以通过命令行让程序从指定IP开始扫描,可以使用pthread库让程序多线程同时执行。但事实上C语言只能算是一个入门级别的语言,很多操作都有局限,笔者只是希望通过这个程序给大家一个思路,因为使用Python等面向网络的语言能够方便的处理这种问题。如果后续有需要,我会再增加完善此帖。

零号地衣 2017-7-18

原创粉丝点击