设置网卡可以接收所有IP的数据(混杂模式)

360 views 六月 16, 05 by Timothy

// Function name : SetAdapterReceiveAll
// Description : 设置网卡可以接收所有IP的数据(混杂模式)
// Return type : void
bool SetAdapterReceiveAll()
{
//检查Winsock版本
WORD ver=MAKEWORD(2,2);
WSADATA wsaData;
int err=WSAStartup(ver,&wsaData);
if(err!=0)
{
_RPT2( _CRT_ERROR,”启动WinSocket version %d.%d 错误!”,2,2);
return false;
}
//创建原始套接字
s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
//设置为对IP头亲自操
BOOL bFlag=TRUE;
err=setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&bFlag,sizeof(bFlag));
if(err!=0)
return false;
//获得本机地址
char hostname[256];
memset(hostname,0,256);
err=gethostname(hostname,256);
if(err!=0)
return false;
struct hostent * phost=gethostbyname(hostname);
if(!phost)
return false;
//把原始套接字绑定到本定网卡
struct sockaddr_in addr_in;
memset(&addr_in,0,sizeof(addr_in));
addr_in.sin_addr=*(in_addr *)phost->h_addr_list[0];
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);//端口号,可以是任意值,但最好不要和公共端口冲突
bind(s, (PSOCKADDR)&addr_in, sizeof(addr_in));
// dwValue为输入输出参数,为1时执行,0时取消
DWORD dwValue = 1;
// 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
// 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
ioctlsocket(s, SIO_RCVALL, &dwValue);
return true;
}

分享到:

声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论,对其完全的正确不做任何担保或假设
本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权,除非注明,本站文章均为原创,转载请注明转自 Timothy's Space 并应以链接形式标明本文地址!

你可能也对下列文章感兴趣

  • 没有相关文章!

<

这篇文章还没有人评论... 赶快来抢沙发吧!.


Leave a Reply

 您已输入0

(Ctrl+Enter)