在局域网进行IP包捕获的一种方法
首先是几种结构的定义(网上搜索或查阅相关文献):
er = 1 >//定义IP地址结构
结构IP地址
{
无符号短IP _ a,
IP _ b,
IP _ c,
IP _ d;
};
//定义IP数据头的结构
struct IP _ header
{
unsigned short IP _ version,/*IP的版本号*/
IP _ HDR _ len,/*IP头的长度*/
IP _ tos/* IP包的服务类型*/
IP _ total _ len,/* IP包的总长度*/
IP _ ID,/* IP包段标识符*/
ip_flags,/。/*IP数据包的校验和*/
Struct IP address IP _ src _ addr,/* IP数据包的源IP地址*/
IP _ dest _ addr;/* IP数据包的目的IP地址*/
} IP header;
//IP包的链表结构
struct stru _ IP _ link
{
char RCV _ IP _ BUF[max _ IP _ size];
struct stru _ IP _ link * next;
};
然后是协议的定义(包括对应的头文件#include #include):
Ord dwcontrolcode = SiO _ rcvall,/*接收所有IP数据包*/
dw protocol = IP proto _ IP;/*协议类型是IP*/
然后是相应的捕获处理:
1.加载Winsock;
2.创建套接字连接以接收原始IP数据包;
3.绑定到接口;
4.设置WSAIoctl并接收所有IP数据包。
参考代码:
if (WSAIoctl(s,dwIoControlCode,&optval,sizeof(optval),
NULL,0,&dwBytesRet,NULL,NULL) == SOCKET_ERROR)
...
5.然后设置一个线程来捕获:
(1)创建用于接收IP分组的链表头;
(2)设置一个标识符,如果为真,则连续捕获IP包;
(3)建立一个新节点,将捕获的数据包添加到该节点;
(4)如果链表长度达到指定长度,则创建一个线程解析链表的IP包;当IP包的链表小于给定长度且IP捕获停止时,设置另一种处理链表的方法;
(5)为下一个IP数据包链表创建一个链表头。
6.建立一个线程解析并显示IP包,解析IP包,然后显示IP包。
位律师回复
0条评论