linux环境下tcpdump源代码分析

 原文时间 2013-10-11 13:13:02  CSDN博客
原文链接  http://blog.csdn.net/han_dawei/article/details/12615199
主题 Tcpdump 源码分析
 作者:韩大卫 @ 吉林师范大学
tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解,只展示linux平台使用的一部分核心代码。 Tcpdump 的使用目的就是打印出指定条件的报文,即使有再多的正则表达式作为过滤条件。所以只要懂得tcpdump -nXXi eth0 的实现原理即可。 进入main之前,先看一些头文件 netdissect.h里定义了一个数据结构struct netdissect_options来描述tcdpump支持的所有参数动作,每一个参数有对应的flag, 在tcpdump 的main 里面, 会根据用户的传入的参数来增加相应flag数值, 最后根据这些flag数值来实现特定动作。各个参数含义请参考源代码注释。 struct netdissect_options { int ndo_aflag; /* translate network and broadcast addresses */ //打印出以太网头部 int ndo_eflag; /* print ethernet header */ int ndo_fflag; /* don't translate "foreign" IP address */ int ndo_Kflag; /* don't check TCP checksums */ //不将地址转换为名字 int ndo_nflag; /* leave addresses as numbers */ int ndo_Nflag; /* remove domains from printed host names */ int ndo_qflag; /* quick (shorter) output */ int ndo_Rflag; /* print sequence # field in AH/ESP*/ int ndo_sflag; /* use the libsmi to translate OIDs */ int ndo_Sflag; /* print raw TCP sequence numbers */ // 报文到达时间 int ndo_tflag; /* print packet arrival time */ int ndo_Uflag; /* "unbuffered" output of dump files */ int ndo_uflag; /* Print undecoded NFS handles */ //详细信息 int ndo_vflag; /* verbose */ // 十六进制打印报文 int ndo_xflag; /* print packet in hex */ // 十六进制和ASCII码打印报文 int ndo_Xflag; /* print packet in hex/ascii */ //以ASCII码显示打印报文 int ndo_Aflag; /* print packet only in ascii observing TAB, * LF, CR and SPACE as graphical chars */ ... //默认的打印函数 void (*ndo_default_print)(netdissect_options *, register const u_char *bp, register u_int length); void (*ndo_info)(netdissect_options *, int verbose); ... } interface.h 接口头文件,定义了一堆宏就为了方便调用struct netdissect_options里的成员。 #ifndef NETDISSECT_REWORKED extern netdissect_options *gndo; ... #define nflag gndo->ndo_nflag ... #define tflag gndo->ndo_tflag ... #define vflag gndo->ndo_vflag #define xflag gndo->ndo_xflag #define Xflag gndo->ndo_Xflag ... #endif tcpdump.c int main(int argc, char **argv) { register char *cp, *infile, *cmdbuf, *device, *RFileName, *WFileName; pcap_handler callback; int type; struct bpf_program fcode; struct print_info printinfo; ... //对netdissect_options中一些参数初始化 gndo->ndo_Oflag=1; gndo->ndo_Rflag=1; gndo->ndo_dlt=-1; gndo->ndo_default_print=ndo_default_print; gndo->ndo_printf=tcpdump_printf; gndo->ndo_error=ndo_error; gndo->ndo_warning=ndo_warning; gndo->ndo_snaplen = DEFAULT_SNAPLEN; ... opterr = 0; while ( /*经典的getopt框架。 字符数组为tcpdump 支持的全部参数。可以看到, 参数x, X,t这些参数后面没有:或::, 这说明这些参数会产生叠加的效果。 */ (op = getopt(argc, argv, "aA" B_FLAG "c:C:d" D_FLAG "eE:fF:G:i:" I_FLAG "KlLm:M:nNOpqr:Rs:StT:u" U_FLAG "vw:W:xXy:Yz:Z:")) != -1) switch (op) { ... //case 里面的处理大多相似,以下仅用-i,-X,-x做例。 //-i 参数用来指定网口 case 'i': if (optarg[0] == '0' && optarg[1] == 0) error("Invalid adapter index"); device = optarg; break; … //-x 为以十六进制打印报文,如使用-xx, xflag数值为2,后面根据xflag>1来打印出链路层头部 case 'x': ++xflag; ++suppress_default_print; break; case 'X': ++Xflag; ++suppress_default_print; break; //case 'n', case 'A'等操作类似如上 ... } ... /*展开核心代码前处理信号,信号处理函数cleanup会调用info()来打印当用户按ctrl+c等发送中止信号时tcpdump显示已处理报文的统计信息。 3 packets captured 3 packets received by filter 0 packets dropped by kernel */ (void)setsignal(SIGPIPE, cleanup); (void)setsignal(SIGTERM, cleanup); (void)setsignal(SIGINT, cleanup); (void)setsignal(SIGCHLD, child_cleanup); ... //从 -r 参数读取指定文件, 在此忽略 if (RFileName != NULL) { ... } else { //如果没有-i 参数来指定网络接口, 那么调用 pcap_lookupdev()来寻找可用的网络接口 if (device == NULL) { device = pcap_lookupdev(ebuf); if (device == NULL) error("%s", ebuf); } /*pcap_open_live() 定义为: pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf) device为要打开的指定设备 snaplen为最大报文长度, 由-s 指定. 默认为65536. Promise 为是否要将网口配置为混杂模式, 由-p 指定,!Pflag:默认为是。 to_ms 为超时时间。 *ebuf 为传递错误信息使用。 函数返回捕获报文的句柄。 */ *ebuf = '\0'; pd = pcap_open_live(device, snaplen, !pflag, 1000, ebuf); if (pd == 

转载于:https://www.cnblogs.com/Recan/p/6034520.html

【转载】linux环境下tcpdump源代码分析相关推荐

  1. linux环境下内存溢出分析MAT

    文章目录 1 下载及安装mat 1.1 下载地址 1.2 查看服务器版本 1.3 下载安装 2 配置 3 运行 4 分析 1 下载及安装mat 1.1 下载地址 https://www.eclipse ...

  2. Linux多网卡不通网段,[转载]linux环境下,双网卡配置不同网段后,路由问题

    最近,新上线了10几台服务器,系统是centos 6.0 按照以前的惯例,配置服务器生产网络和维护网络.每台服务器的eth0 配置ip为生产网络,eth3配置为维护网络,生产网络和维护网络,物理上隔离 ...

  3. Linux 环境下的抓包工具 - tcpdump

    Linux 环境下,通常通过 tcpdump 来进行抓包和分析.它是几乎所有 Linux 发行版本预装的数据包抓取和分析工具. 一.tcpdump 的用法 tcpdump [-aAbdDefhHIJK ...

  4. linux环境下常用的网络命令ping、telnet、traceroute、tcpdump

    文章目录 前言 网络 网络命令 ping telnet nc traceroute tcpdump 总结 前言 因特网(Internet)的前身是美国国防部高级研究计划局(ARPA)用于军事目的的通信 ...

  5. linux彻底卸载multipath,深度分析LINUX环境下如何配置multipath

    首先介绍一下什么是多路径(multi-path)?先说说多路径功能产生的背景,在多路径功能出现之前,主机上的硬盘是直接挂接到一个总线(PCI)上,路径是一对一的关系,也就是一条路径指向一个硬盘或是存储 ...

  6. LINUX环境下资源下载中文目录及中文文件名称问题

    为什么80%的码农都做不了架构师?>>>    http://www.yeeach.com/2009/04/09/linux%E7%8E%AF%E5%A2%83%E4%B8%8B%E ...

  7. Linux环境下段错误的产生原因及调试方法小结

    From:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基 ...

  8. Linux环境下路由表配置一

    路由表配置网关及端口   网络地址:分析目标地址 接口:数据有可能从路由器的哪个出口出来,哪个就是接口 网关:目标网络与发数据的设备不在一个网段内,下一个路由器邻近主配置路由器的接口ip就是网关,线路 ...

  9. Linux 环境下的高级隐藏技术

    摘要:本文深入分析了Linux环境下文件.进程及模块的高级隐藏技术,其中包括:Linux可卸载模块编程技术.修改内存映象直接对系统调用进行修改技术,通过虚拟文件系统proc隐藏特定进程的技术. 隐藏技 ...

最新文章

  1. Android笔记:Fragment与Activity之间的交互,onAttach,退出最后一个 fragment
  2. linux opencv
  3. oracle数据类型查询,Oracle 空间查询, 数据类型为 sdo_geometry
  4. agile organization
  5. 【算法】一个简单的线性判别分析(LDA)原理
  6. java spring框架 注解_详解Java的Spring框架中的注解的用法
  7. 零基础学python-零基础适合学习python吗?
  8. 3.c语言结构体成员内存对齐详解
  9. 【转】演化博弈理论(EGT)
  10. 什么样的音乐和呼噜声最配?
  11. PyQt5报错Process finished with exit code -1073740791 (0xC0000409)
  12. 综合应用_6多字符串-烟锁池塘柳
  13. Java 选择视频文件对话窗口
  14. php中单选框可以默认选中吗,php selectradio和checkbox默认选择的简单示例
  15. java实现-现奔跑吧小恐龙-小游戏
  16. 设计模式之禅之单一职责原则
  17. HTML5 table表格合并单元格和合并边框
  18. postgresSQL的FDE加密
  19. error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file
  20. 【Oracle经典】132个oracle热门精品资料——下载目录 ...

热门文章

  1. Could not resolve host: 'localhost 报错解决办法
  2. php设置session 生命周期,设置session的生命周期(php)
  3. dll模块化设计与编程_FPGA设计原则经验分享
  4. java8 stream 做累加_《Java 8 in Action》Chapter 1:为什么要关心Java 8
  5. link url下载php,php脚本生成google play url的下载链接,下载apk并自动反编译后获取android版本号...
  6. SQLServer奇偶数的输出
  7. 怎么用java跟数据库建立关系,java – 关系和构建数据库
  8. android汽车音频焦点方案,管理音频焦点  |  Android 开发者  |  Android Developers
  9. jsp论坛网站模版_网站被降权了?看看这些解决方法,或许有帮助哦
  10. oracle 存储过程 db,oracle数据库的存储过程是什么?