设置混杂模式的过程
一、首先要包含头文件mstcpip.h
二、要取得本地的IP地址
三、建立一个协议为IPPROTO_IP的原始套接字
四、将套接字与本地地址绑定,注意不能与INADDR_ANY进行绑定;
五、利用ioctlsocket()函数控制套接字为SIO_RCVALL模式;
六、详细代码
//得到本地机器名
char name[20];
int retval;
retval=gethostname(name,20);
if(retval==SOCKET_ERROR)
{
MessageBox("无法获得本地的机器名");
return ;
}
//通过机器名得到本地的IP地址
struct hostent *pHostent;
pHostent=gethostbyname(name);
if(pHostent==NULL)
{
MessageBox("无法得到本地的IP地址");
return;
}
char *tmpip,*ip;
tmpip=pHostent->h_addr;
ip=inet_ntoa(*((struct
in_addr*)tmpip));//获得本地的IP地址
//建立原始套接字
SOCKET m_sk;
m_sk=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
if(INVALID_SOCKET ==m_sk)
{
MessageBox("建立套接字失败!");
return;
}
struct sockaddr_in localaddr;//本地地址
memset(&localaddr,0,sizeof(sockaddr_in));
localaddr.sin_family=AF_INET;
//必须指定本地的网卡的地址,不能用INADDR_ANY来指定
localaddr.sin_addr.s_addr=inet_addr(ip);
//原始套接字与本地地址绑定
retval=bind(m_sk,(struct
sockaddr*)&localaddr,sizeof(sockaddr));
if(SOCKET_ERROR==retval)
{
MessageBox("绑定套接字失败!");
return;
}
//设置混杂模式
unsigned long flag=1;//允许或禁止标记
//必须要先绑定本地的地址,然后设置套接字可以接受所有IP包
if(SOCKET_ERROR==ioctlsocket(m_sk,SIO_RCVALL,
&flag))
{
MessageBox("设置套接字失败");
return;
}
出处:http://blog.sina.com.cn/leetow