// 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; }
设置网卡可以接收所有IP的数据(混杂模式)
支持原创技术分享,据说打赏我的人,都找到了女朋友!