在局域网进行IP包捕获的一种方法 字串9
首先是几个结构的定义(网上搜索或者查阅相关文档): 字串9
字串9
//定义IP地址结构 字串7
struct IPADDRESS 字串3
{
字串2
unsigned short ip_a, 字串2
ip_b,
ip_c,
ip_d; 字串1
};
字串5
字串9
//定义IP数据包头的结构 字串3
struct IP_HEADER
字串8
{ 字串8
unsigned short ip_version, /*IP的版本号 */
ip_hdr_len, /*IP包头的长度*/ 字串3
ip_tos, /*IP包的服务类型*/ 字串8
ip_total_len, /*IP包的总长度*/
字串3
ip_id, /*IP包的分段标识*/
ip_flags, /*IP包的分段标志*/
字串6
ip_frag_offset, /*IP包的分段偏移*/ 字串8
ip_ttl, /*IP包的生存时间*/ 字串6
ip_proto, /*IP包的高层协议*/ 字串7
ip_hdr_chksum; /*IP包的校验和*/
字串3
struct IPADDRESS ip_src_addr, /*IP包的源IP地址*/
字串3
ip_dest_addr; /*IP包的目的IP地址*/
字串4
}ipheader; 字串1
字串5
//IP包的链表结构
struct stru_ip_link
{ 字串9
char rcv_ip_buf[MAX_IP_SIZE];
字串4
struct stru_ip_link *next;
字串4
};
字串3
字串5
然后是协议的定义(包含相应的头文件#include
字串8
DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包*/ 字串5
dwProtocol=IPPROTO_IP; /*协议类型为IP*/
字串2
然后是相应的捕获处理: 字串2
字串6
1.加载 Winsock
字串5
字串9
2.创建一个接收原始IP包的socket连接
字串8
3.绑定到一个接口 字串6
字串3
4.进行WSAIoctl设置,接收所有的IP数据包 字串2
字串5
参考代码: 字串8
字串6
if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval),
字串6
NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR)
字串1
字串7
... 字串4
字串3
5.接着设定一个线程进行捕获:
字串9
(1)创建一个接收IP包的链表头
字串8
(2)设置一个标识,为真,则不断进行IP包的捕获 字串3
字串1
(3)建立一个新的结点,将捕获的数据包加入到该结点
字串5
(4)如果链表的长度达到指定的长度,创建一个线程对该链表的IP包进行解析;再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理 字串4
字串4
(5)为下一个IP包链表创建一个链表头 字串8
字串6
6.建立一个进行IP包解析并显示的线程,进行解析IP数据包,然后显示IP数据包。 字串2