相信很多朋友都遇到过这样的情况,用Sinffer,其实只是为了分析自己机器和网络的通信,这时网卡并不需要工作在混杂模式下。
而且,网卡的混杂模式还有一个问题。将会对一些基于包过滤的防火墙产生影响,这些防火墙在网卡的混杂模式下,将会对通行的数据包产生误报。(真是传说中的头脑混乱……)
看过用基于RAW-Socket的那个Sniffer吧?里头有一句这么写的:
iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL,(LPVOID)&dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
这个把RAW-SOCKET设置为RCVALL,就是把网卡设置为混杂模式。但是令我郁闷的是,我Baidu完了Google,Google完了Baidu,换了N多的Keywords,就是没找到怎么把网卡设为直接模式。(难道是我搜索引擎功夫不到家?)
其实这么写就可以了:
iErrorCode=WSAIoctl(SockRaw, _WSAIOW(IOC_VENDOR,2),(LPVOID)&dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
刚刚接触RAW-Socket,不懂啊。。。不过经过测试,这么写可以抓本机收发的数据报,而且不会改变网卡的状态。