Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251553
  • 博文数量: 35
  • 博客积分: 198
  • 博客等级: 入伍新兵
  • 技术积分: 443
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-28 10:30
文章分类

全部博文(35)

文章存档

2015年(5)

2014年(14)

2013年(8)

2012年(7)

2011年(1)

我的朋友

分类: C/C++

2012-12-14 09:28:58

今天无聊,突发想写个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。
阅读(7370) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~