Linux网络编程六、报文解析(1)
一、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)的更多相关文章
- Linux网络编程(六)
网络编程中,使用多路IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个套接口. 3.一个tcp服务程序既要处理监听套接口,又要处理 ...
- Linux 网络编程六(socket通信UDP版)
//udp接收消息 #include <stdio.h> #include <stdlib.h> #include <string.h> #include < ...
- Linux网络编程——原始套接字实例:MAC 头部报文分析
通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 M ...
- Linux网络编程&内核学习
c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...
- 很全的linux网络编程技巧
本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ...
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
- linux网络编程_1
本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
随机推荐
- 5-MySQL DBA笔记-开发技巧
第5章 开发技巧 本章将介绍一些和数据库相关的开发技巧.由于开发领域很广,这里只选取部分比较常见的小技巧.5.1 存储树形数据 有时我们需要保存一些树形的数据结构,比如组织架构.话题讨论.知识管理.商 ...
- 01 Java 内存分配全面浅析
http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...
- SQL Prompt 注册后隔一段时间莫名无法使用的处理
https://blog.csdn.net/anyqu/article/details/88537197 以前一直以为是授权丢了,反复重装也解决不了 Sql Prompt---Unable to co ...
- 安川机器人Yaskawa
安川机器人自动回原点 1. 判断机器人是否在安全位置 (立方体干涉区) 2. 读取机器人当前位置 GETS PX000 $PX001 读取基座标下的机器人当前位置并放到位置型变量P000中 $P ...
- git bash配置SSH远程连接阿里云ECS
1.连接配置 1-1.添加安全组规则 1-2.使用GitHub的话本地都会有id_rsa.pub(公钥),id_rsa(私钥),一般保存在C盘用户目录下.ssh文件夹. 把公钥内容复制下来(ssh-r ...
- Android opengl 笔记
1. varying vec2 vTextureCoord; 不能用in vec2 ,varying 表示在vs 和 fs中都可见. 2. android 里面 0 和1 都要打小数点 比如0.0 1 ...
- EF Core的级联删除
级联删除由DeleteBehavior的枚举值来设置: 行为名称 对内存中的依赖项/子项的影响 对数据库中的依赖项/子项的影响 Cascade 删除实体 删除实体 ClientSetNull 外键属性 ...
- 每日一句 Linux, 持续精进
每日一句 Linux, 持续更新 2019.12.10 1.远程登录 linux 服务器.首先要按照ssh(win10默认是安装了的).命令行窗口,使用 ssh 登录名@serverIp,之后输入密码 ...
- 许愿墙JQ
<!doctype html> <html> <head> <meta charset="utf-8"> <t ...
- Java动态追踪技术探究(动态修改)
Java动态追踪技术探究 Java探针-Java Agent技术-阿里面试题 秒懂Java动态编程(Javassist研究) 可以用于在类加载的时候,修改字节码. Java agent(Java探针) ...