设置网卡混杂模式

关键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 请大家批评指正

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值