今天无聊,突发想写个sniffer简单程序,参考了网上sniffer的一般流程,总的来说呢,将网卡设置为混杂模式就能接受所有以太网中的广播包了,网卡设置混杂模式函数如下:- BOOL flag =TRUE ;
- //设置亲自处理IP报文头
- iResult = setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
- //网卡设置混杂模式函数
- DWORD dwOutBuffer[10];
- DWORD dwInBufferLen = 1;//RCVALL_ON
- DWORD dwBytesReturned = 0;
-
- iResult = WSAIoctl(sock,
- SIO_RCVALL,
- &dwInBufferLen,
- (DWORD)sizeof(dwInBufferLen),
- &dwOutBuffer,
- (DWORD)sizeof(dwOutBuffer),
- &dwBytesReturned,
- NULL,
- NULL);
在调用的时候WSAIoctl WSAGetLastError()一直返回10022错误,查找帮助问题是:“提供了一个无效的参数”,我这台电脑是台式机,网卡就一张,另外装了一个虚拟机,那么是不是这个问题呢,一张网卡对应了好几个interface,那么设置Bind地址的时候,如果设置了“127.0.0.1”或者INADDR_ANY 是不是应该出问题呢,而程序bind的时候恰好用的是“127.0.0.1”回环地址,更改bind 设置为上网的接口地址,例如:- memset(&host,0,sizeof(host));
- host.sin_family = AF_INET;
- host.sin_port = htons(0);
- host.sin_addr.s_addr = inet_addr("172.16.0.12");
再次执行设置混杂模式的时候,问题解决OK。 11-08 06:38