在局域网进行IP包捕获的一种方法
首先是几个结构的界说(网上搜刮大概查阅相关文档):
//界说IP地址结构
struct IPADDRESS
{
unsigned short 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包的分段标记*/
ip_frag_offset, /*IP包的分段偏移*/
ip_ttl, /*IP包的生活时间*/
ip_proto, /*IP包的高层协议*/
ip_hdr_chksum; /*IP包的校验和*/
struct IPADDRESS ip_src_addr, /*IP包的源IP地址*/
ip_dest_addr; /*IP包的目的IP地址*/
}ipheader;
//IP包的链表结构
struct stru_ip_link
{
char rcv_ip_buf[MAX_IP_SIZE];
struct stru_ip_link *next;
};
然后是协议的界说(包罗相应的头文件#include #include):
DWORD dwIoControlCode=SIO_RCVALL, /*接收所有的IP包*/
dwProtocol=IPPROTO_IP; /*协议类型为IP*/
然后是相应的捕获处理:
1.加载 Winsock;
2.创建一个接收原始IP包的socket毗连;
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数据包。
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|