最近在做信息安全导论的实验,实验很简单,就是实现一个ping程序,能够扫描主机是否打开的情况,但是,我也就纳了闷了,每次有个不易发现的bug(可能由于自己知识有限造成的),都得让我碰上,并且还得为这个bug操心好长时间,才能解决。。。。。。(抱怨是最浪费时间的一种行为!)ok~为了下次不再犯同样的错误,现在先记录一下吧~
我的错误是,在一切都准备好了的时候(初始化套接字,创建套接字,填充icmp数据头,设定超时时间)发送数据包,成功,但是一旦接受就会超时,为此,我找了个能发送成功的程序,一步步的对照着看看哪儿不一样,但是对照完了,发现一些核心代码是一样的。。。。。。这就蛋疼了,然后我就怀疑是不是因为这些小的错误导致的呢?我一步步的改正,首先我怀疑我的可能是因为发送和接受我放在了不同的函数里面,导致,在一个函数返回的时间里,接受函数错过了接受(现在想想真是有病乱投医啊。。。。。。。操作系统在端口应该有缓存的吧,在接受到数据后,会存到缓存里,然后才会调用。。。。。)我就把所有函合并成了一个函数,果不其然,没有任何效果,依旧是发送超时。在经历无尽的折磨以后,我发现我的变量全是定义在类里面的,而其他的程序就是在函数里面直接声明,或者就是全局变量的,难道是因为类,半信半疑我就把所有定义在类里面的变量放到了cpp文件当中,作为全局变量调用,成功了~我去了!不应该啊,这是因为啥???在一个函数调用类里面的变量后,不改变内存中值?上课时不是这么讲的啊。。。。。。苦逼的程序猿我,又一次发挥了初中时在物理课上学的控制变量法。。。。。。。。(我真丫该去学物理去。。。。。)一个一个的把变量弄回去,好了,终于发现了!!!!!!发送的数据包(实质是一个数组)没有初始化,我擦了,为毛没有初始化会出现这个情况?我发送时就是发送了icmp的头部数据,跟其他数据没有关系啊,在经过我控制变量法的不断检验下,不管缓冲区有多大,只有初始化为0,后才可能接受成功,也就是被ping的主机识别。具体原因还有待进一步的研究。
下面来对原始套接字编程进行说明一下:
总体步骤是:
1、用管理员权限打开编辑器(vc6.0或vs)
2、创建ip和icmp的头部数据结构