一、pcap文件解析

  依赖的库:libpcap,头文件:pcap/pcap.h

  获取pcap文件:tcpdump,-i:指定监听接口,默认配置好的最小的号码的接口。-w:指定存入文件,将原始报文存入指定文件。-r:读取指定文件。

  解析pcap文件:

    1、pcap_t *pcap_open_offline(char *fname, char *ebuf);

      打开指定的pcap文件。

      fname:文件名。

      ebuf:传出参数,传出pcap_open_offline出错返回NULL时的错误消息。

      返回值:成功返回对应文件的指针,失败返回NULL。

    2、int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user);

      处理pcap数据。

      p:指定处理目标。

      cnt:指定处理数量。-1或0则为无限大,p指定的是保存下来的文件,则处理到文件尾,p指定的是实时数据,则一直处理下去,直到出错或者调用pcap_breakloop()。

      callback:指定处理数据的回调函数。typedef void (*pcap_handler)(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes);  user为pcap_loop第三个参数user,h结构体指针,存储数据报的时间戳和长度,caplen为抓取到报文实际大小,len为理论大小,两者大小不一致说明报文弄断不能解析。bytes为数据报的首地址。

      user:回调函数的传入传出参数。

      返回值:数据处理完返回0,出错返回PCAP_ERROR,循环结束或调用pcap_breakloop()返回PCAP_ERROR_BREAK,处理实时数据不返回。

    3、int pcap_dispatch();  参数列表和功能同pcap_loop(),不同之处在于处理实时数据时超时loop不返回,阻塞,而pcap_dispatch会返回。返回处理的数据数量。

    4、void pcap_breakloop(pcap_t *);  终止loop或dispatch函数。

    5、void pcap_close(pcap_t *p);  关闭并释放打开的pcap_t。

    6、pcap_t *pcap_create(const char *source, char *errbuf);

      创建监听实时数据的pcap_t。source指定监听接口,指定为"any"或者NULL则监听所有接口。errbuf同上。pcap_open_live()功能同create,live参数配置复杂,但是可以指定超时时间。

二、以太网帧解析

  头文件:/usr/include/net/ethernet.h

//ethernet.h代码片段
struct ether_header

uint8_t ether_dhost[ETH_ALEN]; //目标MAC地址,ETH_ALEN一般为6
uint8_t ether_shost[ETH_ALEN]; //源....
uint6_t ether_type; //包裹的数据类型:IP,ARP,RARP。判断时用htons(nums)将nums转成网络字节顺序
}

例:

#include <pcap/pcap.h>
#include <net/ethernet.h>
#include <stdio.h>
#include <arpa/net.h> char errbuf[PCAP_ERRBUF_SIZE]={};
pcap_t *handle=NULL;
handle=pcap_open_offline("a.cap", errbuf);
pcap_loop(handle, -, handler, NULL); //回调函数
void handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes)
{
struct ether_header* ether_packet= (struct ether_header*)bytes;
int ether_len=h->caplen;
printf("ether_len= %d\n", ether_len);
printf("dmac: ");
for(int i= ; i<; ++i)
{
printf("%02x", ether_packet->ether_dhost[i]);
}
printf("\n"); printf("smac: ");
for(int i= ; i<; ++i)
{
printf("%02x", ether_packet->ether_shost[i]);
}
printf("\n"); if (ether_packet->ether_type == htons(0x0800)) //判断是否是IP
{
//IP
// .......
} }

Linux网络编程六、报文解析(1)的更多相关文章

  1. Linux网络编程(六)

    网络编程中,使用多路IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个套接口. 3.一个tcp服务程序既要处理监听套接口,又要处理 ...

  2. Linux 网络编程六(socket通信UDP版)

    //udp接收消息 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...

  3. Linux网络编程——原始套接字实例:MAC 头部报文分析

    通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 M ...

  4. Linux网络编程&内核学习

    c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...

  5. 很全的linux网络编程技巧

    本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ...

  6. 【linux草鞋应用编程系列】_5_ Linux网络编程

    一.网络通信简介   第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章.   二.linux网络通信     在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...

  7. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

  8. linux网络编程_1

    本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  9. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

随机推荐

  1. 常用bat文件

    rmLog.bat @echo offpause >nul | echo 按任意键继续3pause >nul | echo 按任意键继续2pause >nul | echo 按任意键 ...

  2. Advanced Installer 关于桌面的快捷方式。

    由于软件自动生成快捷方式,我发现桌面可以存在多个软件的快捷方式,因为快捷方式只要名字不同就可以存在多个,即使名字相同,只要备注不同,又可以存在多个. 那么由于软件自带生成快捷方式的功能,为了避免桌面出 ...

  3. VS Code 运行 JavaScript 文件时出现“node...”乱码或错误

    1.错误图片: 2.如果是中文乱码的话,可以到设置里边把「Auto Guess Encoding」这一项勾起来. 3.如果不是这个原因,可能是因为没安装 Node.js 和配置 Node.js 环境, ...

  4. Centos7.7安装swoole

    系统版本:centos 7.7(查看系统版本:cat /etc/redhat-release) 执行命令安装swoole: yum update -y && yum remove ph ...

  5. 2.XML语言

    XML语言 常见应用: XML技术除用于 /*保存有关系的数据*/之外,它还经常作软件配置文件,以描述程序模块之间的关系. 在一个系统软件中,为提高系统的灵活性,它所启动的模块通常由其配置文件决定 例 ...

  6. 7.使用EXPLAIN 来分析SQL和表结构_1

    explain:查看执行计划 使用explain 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的 分析你的查询语句或是表结构的性能瓶颈 使用explain 可以获 ...

  7. java EE,java Web中的400,404,405等各种错误介绍

    4 请求失败4xx 4xx应答定义了特定服务器响应的请求失败的情况.客户端不应当在不更改请求的情况下重新尝试同一个请求.(例如,增加合适的认证信息).不过,同一个请求交给不同服务器也许就会成功. 4. ...

  8. 一秒钟教会你如何 使用jfreechart制作图表,扇形图,柱形图,线型图,时序图,附上详细代码,直接看效果

    今天有小伙伴问到我怎么使用jfreeChat生成图标,去年就有一个这方便的的总结,今天再遇到,就总结出来,供大家参考: 第一个: 创建柱状图,效果图如下: 柱状图代码如下: package cn.xf ...

  9. c语言之一个简单的《学生教师管理系统》小结记录(二)

    本篇博文用来记录学生头/教师文件建立以及结构体链表创建及链表相关操作 首先是头文件的建立 头文件包含学生结构体以及链表结构 1.学生结构体建立 /****定义学生信息******/ typedef s ...

  10. namespace" 或The content of element type "mapper" must match "EMPTY"

    必须为元素类型 "mapper" 声明属性 "namespace" 或The content of element type "mapper" ...