// PackCaptureDlg.h:header file#define IPV4_WERSION 4#define IPV6_WERSION 6#define ICMP_PACKET 1#define IGMP_PACKET 2#define TCP_PACKET 6#define EGP_PACKET 8#define UDP_packet 17#define OSPF_PACKET 89class CPackCaptureDlg:public CDialog{public://{{AFX_DATA(CFindHostDlg)enum {IDO=IDO_PACKCAPTURE_DIALOG};int m_Count;CString m_Packet;//}}AFX_DATAprotected://{{AFX_MSG(CFindHostDlg)afx_msg void OnCapture();//}}AFX_MSGprivate:typedef struct IP_HEAD//IP头部结构{union{unsigned char Version;//版本(字节前四位)unsigned char HeadLen;//头部长度(字节后四位)};unsigned char ServiceType;//服务类型unsigned short TotalLen;//总长度unsigned short Identifier;//标识符union{unsigned short Flags;//标志位(字前三位)unsigned short FragOffset;//片偏移(字后13位)};unsigned char TimeToLive;//生存周期unsigned char Protocol;//协议unsigned short HeadChecksum;//头部校验和unsigned int SourceAddr;//源IP地址unsigned int DestinAddr;//目的IP地址}ip_head;typedef struct ICMP_HEAD//ICMP头部结构{unsigned char Type;// 类型unsigned char Code;//代码unsigned short HeadChecksum;// 头部校验和unsigned short Identifior;//标识符unsigned short Sequence;//序号}icmp_head;};//PackCaptureDlg.cpp :implementation file#include "stdafx.h"#include "PackCaptureDlg.h"#include "PackCapture.h"#include "winsock2.h"#include "ws2tcpip.h"#pragma comment(lib,"ws2_32")#define IO_RCV ALL _WSAIOW(IOC_VENDOR,1)void CPackCaptureDlg::OnCapture(){WSADATA WSAData; //建立与Socket库绑定if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){MessageBox("WSAStartup初始化失败!");return;}SOCKET Socket; //创建原始SocketSocket=socket(AF_INET,SOCK_RAW,IPPROTO_IP);if(Socket==INV ALID_SOCKET){MessageBox("创建Socket失败!");WSACleanup();return;}int RecvTime=5000; //设置Socket操作选项if(setsockopt(Socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&RecvTime,sizeof(RecvTime))==SOCKET_ERROR){MessageBox("设置Socket选项失败!");closesocket(Socket);WSACleanup();return;}char HostName[128]; //获得本地主机名称if(gethostname(HostName,128)==SOCKET_ERROR){MessageBox("获得主机名失败!");closesocket(Socket);WSACleanup();return;}hostent* pHostent; //获得本地主机IP地址pHostent=gethostbyname(HostNmae);if(pHostent==NULL){MessageBox("获得主机地址失败!");closesocket(Socket);WSACleanup();return;}sockaddr_in HostAddr; //定义Socket地址结构memset(&HostAddr,0,sizeof(HostAddr));HostAddr.sin_family=AF_INET;HostAddr.sin_addr.s_addr=(*(in_addr*)pHostent->h_addr).s_addr;int nBind; //绑定Socket与网卡nBind=bind(Socket,(PSOCKADDR)&HostAddr,sizeof(HostAddr));if(nBind==SOCKET_ERROR){MessageBox("绑定Socket失败!");closesocket(Socket);WSACleanup();return;}DWORD dwValue=1; //设置Socket接受模式if(ioctlsocket(Socket,IO_RCV ALL,&dwValue)==SOCKET_ERROR){MessageBox("设置Socket接收器失败!");closesocket(Socket);WSACleanup();return;}UpdateData(true);m_Packet="版本总长度标志位片偏移协议源地址目的地址\r\n";for(int i=0;i<m_Count;i++){char RecvBuf[65535];memset(RecvBuf,0,sizeof(RecvBuf));int nRecv; //依次接受IP数据包nRecv=recv(Socket,RecvBuf,sizeof(RecvBuf),0);if(nRecv==SOCKET_ERROR){MessageBox("接受IP数据包失败!");closesocket(Socket);WSACleanup();return;}else{ip_head IpHead=*(ip_head*)RecvBuf;CString str;if((IpHead.V ersion>>4)==IPV4_VERSION)STR.Format("IPv4");if((IpHead.V ersion>>4)==IPV6_VERSION)STR.Format("IPv6");m_Packet+=str;str.Format("%u ",ntohs(IpHead.TotalLen));m_Packet+=str;str.Format("D=%uM=%u",((ntohs(IpHead.Flags))>>14)&0x01,((btohs(IpHead.Flags))>>13)&0x01);m_Packet+=str;str.Format("%u",ntohs(IpHead.Fragoffset)&0x1fff);m_Packet+=str;switch(IpHead.Protocol){case ICMP_PACKET:str.Format("ICMP");break;case IGMP_PACKET:str.Format("IGMP");break;case TCP_PACKET:str.Format("TCP");break;case EGP_PACKET:str.Format("EGP");break;case UDP_PACKET:str.Format("UDP");break;case OSPF_PACKET:str.Format("OSPF");break;};m_Packet+=str;str.Format("%s",inet_ntoa(*(in_addr*)&IpHead.SourceAddr));m_Packet+=str;str.Format("%s",inet_ntoa(*(in_addr*)&IpHead.DestinAddr));m_Packet+=str;m_Packet+="\r\n";}}UpdateData(false);closesocket(Socket);WSACLeanup(); //解除与Socket库绑定}。