您的位置:首页 > 其它

设置网卡混杂模式

2012-08-24 22:48 411 查看
关键API :ioctlsocket()

设置杂收模式 宏 #define SIO_RCVALL (0x80000000 | (0x18000000) | (1))

IP头:

typedef struct _IPHeader

{ //IP数据包头

BYTE Ver_HLen; //版本+报头长度

BYTE TOS; //服务类型

WORD TotalLen; //总长度

WORD ID; //标识

WORD Flag_Segment; //标志+片偏移

BYTE TTL; //生存周期

BYTE Protocol; //协议类型

WORD Checksum; //头部校验和

in_addr SrcIP; //源IP地址

in_addr DstIP; //目的IP地址

} IPHEADER;

TCP头:

typedef struct _TCPHEADER

{

unsigned short srcPort;//2个字节

unsigned short DestPort;//2个字节

unsigned int sequeceNo; //4 个字节 序号

unsigned int acAnswerNo; //4字节

unsigned char dataoffset;//布首长度

unsigned char flage;

unsigned short windows;

unsigned short checksum;

unsigned short urgentPointer;

}TCPHEADER;

流程 --》 创建socket --》bind 本地地址-》ioctlsocket()设置杂收模式---》recv 接收数据

unsigned int  sinfferClass::_Run(LPVOID lpramra)
{
SOCKET s=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
int nRet=WSAGetLastError();
sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(0);
sin.sin_addr.S_un.S_addr=inet_addr("192.168.0.100");
::bind(s,(sockaddr *)&sin,sizeof(sin));
nRet=WSAGetLastError();
DWORD dwValue=1;
ioctlsocket(s,SIO_RCVALL,&dwValue);
nRet=WSAGetLastError();
char * pbuffer=new char[1024];
IPHEADER ip;
TCPHEADER tcp;
int nIPLen=sizeof(IPHEADER);
int nTcpLen=sizeof(TCPHEADER);
while(1)
{
memset(pbuffer,0,1024);
nRet=recv(s,pbuffer,1024,0);
int destPort=0;

if (nRet>0)
{
memcpy(&ip,pbuffer,nIPLen);
pbuffer=pbuffer+nIPLen;
memcpy(&tcp,pbuffer,nTcpLen);
destPort=ntohs(tcp.DestPort);
TRACE(inet_ntoa(ip.SrcIP));
TRACE("----->");
TRACE(inet_ntoa(ip.DstIP));
memmove(pbuffer,pbuffer+20,nRet-40);
}

}
return true;
}

大概就是这样,代码肯定有一点小bug 请大家批评指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: