BackGround: 计算机网络实验到了用WinpCap进行编程的课时

本实验是通过WinpCap编程来做一个简单的数据包获取显示的软件

---------------------------------------------------------------

一.WinpCap

libpcap是一个UNIX下的C函数库,它提供的API,能获取和过滤从任意一块网卡在数据链路层上的帧。不同的UNIX系统有不同的架构去处理数据链路层上的数据帧,所以程序员如果想要写一个能运行在UNIX上的、直接读取或者操作数据链路层上的帧的应用程序,他就不得不专门为这个特点版本的UNIX写一个访问帧的函数。libpcap的目的就是提供一个抽象层,这样程序员就能编写可运行在所有版本的UNIX上的包获取和分析工具了。
WinPcap是一个专为Windows系统设计的、基于libpcap开发的库.

winpcap有两种 一种是需要安装的驱动程序,一种是直接解压使用的开发包,这里我们要使用的是开发包,但是开发包是基于驱动程序上面使用的,所有首先应该安装Winpcap驱动程序,之后再使用编程软件去使用开发包进行开发
学校使用校园网软件的同学电脑上,基本已经安装好winpcap驱动软件了。

1、下载winpcap驱动软件。
如果是安装了wireshark或者其他数据包拦截软件的话,它就自动帮我们装了winpcap驱动。(wireshark是基于winpcap开发的)
http://www.winpcap.org/install/default.htm 这个是winpcap官网下载页面,我下载的是4.1.3版本的。
下载到本地后,直接双击安装就可以了。

2、下载winpcap开发包
http://www.winpcap.org/devel.htm 这个是winpcap官网的开发包下载,主要它的版本要和驱动版本一致。
下载到本地后,解压缩就可以了。里面有winpcap的库、头文件,以及例子和使用文档

---------------------------------------------------------------------------------------

二.配置VS2015支持进行基于WinPcap开发

1.设置环境目录

右键点击项目-属性-VC++目录

2.设置  包含目录  和  库目录

①首先设置 包含目录,设置为解压的WinpCap开发包的include目录

---------------------------------

-----------------------------------

-----------------------------------

②同样操作设置 库目录,库目录为 Lib目录

------------------------------

以上两个设置好之后就会是这样的

----------------------------------------------------------

3.设置编译预处理

在预处理器里面添加“预处理定义” WPCAP 和HAVE_REMOTE

--------------------------------------------

4.设置链接器
在输入 中添加附加依赖项ws2_32.lib   wpcap.lib Packet.lib 三个依赖包

自此VS2015配置WinpCap开发环境完毕,vs2013配置方法相同

------------------------------------------

#include "pcap.h"
#include <stdio.h>
#include<Windows.h>
typedef struct ip_address
{u_char byte1; u_char byte2;u_char byte3;u_char byte4;
} ip_address;//ipv4地址typedef struct ip_header
{u_char  versionAndHeader;   //版本 + 首部长度u_char  serviceType;       //服务类型    u_short totalLength;         //总长  u_short identification; //标识u_short flagsAndOffset;    //标志位+段偏移  u_char  timeToLive;           //存活时间u_char  protocal;         //协议名u_short headerChecksum; //校验和ip_address  sourceAddress; //源地址ip_address  destinationAddress;//目的地址u_int   option;//附加
} ip_header;//TCP数据包头部typedef struct udp_header
{u_short sourcePort;   //源端口      u_short destinationPort;      //目的端口 u_short len;            //udp数据包长度u_short Checksum;           //校验和
} udp_header;//UDP数据包头部void packHandleFunc(u_char *param, const struct pcap_pkthdr *header, const u_char *data)
{struct tm *localTime; //本地时间结构char timeString[16]; //转换正常的显示时间time_t local_second;//时间戳ip_header *ipHeader; //ip数据包头部udp_header *udpHeader;//udp数据包头部u_int ip_len; //ip头部长度u_short sourceport, destinationport; //源和目的端口local_second = header->ts.tv_sec;//数据包到达时间戳localTime = localtime(&local_second); //时间戳转本地时间格式strftime(timeString, sizeof(timeString), "%H:%M:%S", localTime);//本地时间格式转正常21:11:30时间格式printf("时间:%s, 包长度:%d   ", timeString, header->len);ipHeader = (ip_header *)(data + 14);//跳过以太网头部14字节长度获得ip数据包头部位置ip_len = (ipHeader->versionAndHeader & 0xf) * 4; //只取头部长度udpHeader = (udp_header *)((u_char *)ipHeader + ip_len);//跳到udp头部地址sourceport = ntohs(udpHeader->sourcePort); // ntohs 网络字节转主机字节端口destinationport = ntohs(udpHeader->destinationPort);printf("%d.%d.%d.%d:%d   ->   %d.%d.%d.%d:%d\n",ipHeader->sourceAddress.byte1,ipHeader->sourceAddress.byte2,ipHeader->sourceAddress.byte3,ipHeader->sourceAddress.byte4,sourceport,ipHeader->destinationAddress.byte1,ipHeader->destinationAddress.byte2,ipHeader->destinationAddress.byte3,ipHeader->destinationAddress.byte4,destinationport);
}
int main(int argc, char* argv[])
{pcap_if_t *Devs;pcap_if_t *d;int selectNum;int i = 0;pcap_t *handle;char errBuff[PCAP_ERRBUF_SIZE];if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &Devs, errBuff) == -1){fprintf(stderr, "获取适配器列表失败:%s\n", errBuff);system("pause");exit(1);}for (d = Devs; d; d = d->next){if (d->description)printf("%d. %s\n",++i, d->description);}if (i == 0){printf("\n没有发现适配器,请确认是否已经安装WinCap\n");system("pause");return -1;}printf("请输入要捕获数据包的适配器编号 (1-%d):", i);scanf("%d", &selectNum);if (selectNum < 1 || selectNum > i){printf("\n输入有误噢\n");pcap_freealldevs(Devs);system("pause");return -1;}for (d = Devs, i = 0; i< selectNum - 1; d = d->next, i++);if ((handle = pcap_open(d->name, 65535, PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL, errBuff)) == NULL){fprintf(stderr, "\n不能够打开所选择适配器 %s 不支持WinCap\n", d->name);pcap_freealldevs(Devs);return -1;}printf("接下来开始监听数据包%s...\n", d->description);pcap_freealldevs(Devs);pcap_loop(handle, 0, packHandleFunc, NULL);system("pause");return 0;
}

实验截图:

WinCap数据包显示相关推荐

  1. wireshark官方文档第 9 章数据包解析

    第 9 章数据包解析 9.1. 数据包解析的工作原理 对于一个已封装好的协议包,每个解析器(dissector)对其负责的一部分协议进行解码,然后将解码过程交给后续的解析器. 每个解析都从帧(Fram ...

  2. 如何利用CommMonitor串口监控,抓取串口Modbus RTU数据包

    今天来分享一下,如何抓取串口Modbus RTU数据包. 首先,下载CommMonitor的最新版v12.0,才支持Modbus RTU/ASCII协议分析功能, 同ModbusMonitor RTU ...

  3. Reset 数据包导致的灵异事件

    1. Reset 灵异事件案例 1.1. 场景描述 有一天,业务开发和 DBA 运维跑过来,说凌晨调用 Cetus(数据库中间件)的定时脚本出问题了,Cetus 没有响应回来.当听到这个噩耗,我一脸懵 ...

  4. R语言可视化斜率图、扩充图像纵横比为数据标签显示更整齐、ggrepel包来帮忙

    R语言可视化斜率图.扩充图像纵横比为数据标签显示更整齐.ggrepel包来帮忙 目录

  5. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(配置数据点显示)实战

    R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(配置数据点显示)实战 目录 R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(配置数据点显示)实战

  6. BLAM跑自己的数据包无法显示全局点云地图解决(速腾聚创RS-LiDAR-16 雷达 )-SLAM不学无术小问题

    BLAM算法跑自己的数据包无法显示全局点云地图解决(适配速腾聚创RS-LiDAR-16 雷达 ) 提示:本文笔者使用环境Ubuntu18.04,ROS melodic版本   首先放一个效果链接(由b ...

  7. Wireshark使用(捕获过滤器、显示过滤器、TCP交互抓包示例、抓取本地回环数据包等)

    1.捕获过滤器规则 1.1 作用   捕获过滤器在开始捕捉之前设置,用于从源头控制被过滤的包内容,仅符合规则的包会被捕获并记录进捕获日志文件. 1.2 语法规则 字段:[Protocol][Direc ...

  8. 无尽神域服务器维护,无尽神域突然显示数据包损坏怎么办 解决方案一览

    无尽神域突然显示数据包损坏怎么办 解决方案一览.无尽神域是一款非常好玩的游戏,许多玩家被其优秀的内容和有趣的玩法所吸引.但是近日有小伙伴反应无尽神域突然显示数据包损坏,小编这里整理了一些无尽神域突然显 ...

  9. 战地指挥官 服务器维护,战地指挥官突然显示数据包损坏怎么办 解决数据包损坏方案...

    战地指挥官突然显示数据包损坏怎么办 解决数据包损坏方案.战地指挥官是一款非常好玩的游戏,许多玩家被其优秀的内容和有趣的玩法所吸引.但是近日有小伙伴反应战地指挥官突然显示数据包损坏,小编这里整理了一些战 ...

  10. lego-LOAM跑自己的数据包无法显示全局点云地图解决(速腾聚创RS-LiDAR-16 雷达 )---SLAM不学无术小问题

    LeGo-LOAM跑自己的数据包无法显示全局地图问题 注意:本文笔者使用环境:Ubuntu18.04 ROS melodic 版本 背景      3D SLAM新手,在看到了各种狂拽炫酷的3D点云图 ...

最新文章

  1. 您尝试打开的文件_您是否尝试过重新打开软件团队的身份?
  2. 3位格雷码的顺序编码_绝对值编码器当中的格雷码
  3. Java中读取属性文件以及做资源国际化
  4. 阿里云docker hub
  5. HDU - 5452 Minimum Cut(LCA+树上差分)
  6. java获取泛型的值_java 反射之获取泛型对象的所有字段与对应的值(包括父类的)...
  7. 行内元素中的非替换行内元素和替换行内元素
  8. 小强的HTML5移动开发之路(50)——jquerymobile页面初始化过程
  9. STM32应用笔记转载
  10. 我的世界服务器公会系统,[娱乐|综合|RPG] [付费] Advanced Clans — 更好的公会系统 [1.8-1.15]...
  11. 【java】JOptionPane的几种方法的作用
  12. [转载] python跨行 print:多用(),换行符\要小心,少用+或者不用(其它程序代码跨行用\就行,不能用括号)
  13. Java常见算法之二分法查找算法详解
  14. 用Wineskin在Mac上运行exe文件
  15. 分享一个好用的网页pdf打印插件
  16. 零基础搭建双端影视盒子——二、搭建影视管理后台
  17. 作为执行控制功能”守门人”的前岛叶
  18. 昊昊与他的第一台服务器的故事(一)
  19. 指令于动作之forward动作
  20. 有哪些有格调的免费素材网站?

热门文章

  1. 邮件营销EDM运营笔记:选择合适的EDM平台
  2. CentOS下安装EDM工具
  3. xmarks android,Xmarks Bookmark Sync
  4. zui之0001 npm install zui
  5. java拼音汉字转换
  6. win10怎么更新到1809正式版 升级windows10方法
  7. QQ企业邮箱发送邮件
  8. 计算机桌面图标字变蓝色,桌面的图标都变蓝了怎么解决【解决方法】
  9. 水桶分水问题详解(C++实现)
  10. 在wine里面播放视频和音乐之WMP