今天无聊,突发想写个sniffer简单程序,参考了网上sniffer的一般流程,总的来说呢,将网卡设置为混杂模式就能接受所有以太网中的广播包了,网卡设置混杂模式函数如下:

  1. BOOL flag =TRUE ;
  2. //设置亲自处理IP报文头
  3. iResult = setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));

  4. //网卡设置混杂模式函数
  5. DWORD dwOutBuffer[10];
  6.     DWORD dwInBufferLen = 1;//RCVALL_ON
  7.     DWORD dwBytesReturned = 0;
  8.     
  9.     iResult = WSAIoctl(sock,
  10.             SIO_RCVALL,
  11.             &dwInBufferLen,
  12.             (DWORD)sizeof(dwInBufferLen),
  13.             &dwOutBuffer,
  14.             (DWORD)sizeof(dwOutBuffer),
  15.             &dwBytesReturned,
  16.             NULL,
  17.             NULL);
在调用的时候WSAIoctl WSAGetLastError()一直返回10022错误,查找帮助问题是:“提供了一个无效的参数”,我这台电脑是台式机,网卡就一张,另外装了一个虚拟机,那么是不是这个问题呢,一张网卡对应了好几个interface,那么设置Bind地址的时候,如果设置了“127.0.0.1”或者INADDR_ANY 是不是应该出问题呢,而程序bind的时候恰好用的是“127.0.0.1”回环地址,更改bind 设置为上网的接口地址,例如:

  1.     memset(&host,0,sizeof(host));
  2.     host.sin_family = AF_INET;
  3.     host.sin_port = htons(0);
  4.     host.sin_addr.s_addr = inet_addr("172.16.0.12");
再次执行设置混杂模式的时候,问题解决OK。
11-08 06:38