// 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 89
class CPackCaptureDlg:public CDialog {
public:
//{{AFX_DATA(CFindHostDlg)
enum {IDO=IDO_PACKCAPTURE_DIALOG}; int m_Count;
CString m_Packet; //}}AFX_DATA protected:
//{{AFX_MSG(CFindHostDlg) afx_msg void OnCapture(); //}}AFX_MSG
private: 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 \
#include \#include \#include \#include \
#pragma comment(lib,\
#define IO_RCVALL _WSAIOW(IOC_VENDOR,1) void CPackCaptureDlg::OnCapture() { WSADATA WSAData; //建立与Socket库绑定 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { MessageBox(\初始化失败!\ return; }
SOCKET Socket; //创建原始Socket Socket=socket(AF_INET,SOCK_RAW,IPPROTO_IP); if(Socket==INVALID_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_RCVALL,&dwValue)==SOCKET_ERROR) { MessageBox(\设置Socket接收器失败!\ closesocket(Socket); WSACleanup(); return; } UpdateData(true); m_Packet=\版本 总长度 标志位 片偏移 协议 源地址 目的地址\\r\\n\ for(int i=0;i
M=%u\ m_Packet+=str; str.Format(\ m_Packet+=str; switch(IpHead.Protocol) {
case ICMP_PACKET: str.Format(\ break; case IGMP_PACKET: str.Format(\ break; case TCP_PACKET: str.Format(\ break; case EGP_PACKET: str.Format(\ break; case UDP_PACKET: str.Format(\ break; case OSPF_PACKET: str.Format(\ break; }; m_Packet+=str; str.Format(\ m_Packet+=str; str.Format(\ m_Packet+=str; m_Packet+=\ } }
UpdateData(false); closesocket(Socket);
WSACLeanup(); //解除与Socket库绑定 }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库ip数据包的捕获与解析代码在线全文阅读。
相关推荐: