pcap++实战

安装:

下载releaseprebuilt-ubuntu文件压缩包
解压,其目录为
├── bin
├── example-app
├── include
├── lib
├── LICENSE
└── README.release.md
并软链接,我的path是~/program/pcapplusplus-23.09-ubuntu-20.04-gcc-9.4.0-x86_64

1
2
sudo ln -s bin/ /usr/local/bin
sudo ln -s include/pcapplusplus/ /usr/local/include/

跑demo

https://pcapplusplus.github.io/docs/quickstart

1
sudo apt-get install libpcap-dev

出现错误

错误:1
http://cn.archive.ubuntu.com/ubuntu
focal InRelease
暂时不能解析域名“cn.archive.ubuntu.com” 错误:2
http://security.ubuntu.com/ubuntu
解决方法:更换代理

1
cmake -S . -B build

CMake Error at
/usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146
(message): Could NOT find PCAP (missing: PCAP_LIBRARY
PCAP_INCLUDE_DIR) Call Stack (most recent call first):
/usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:393
(_FPHSA_FAILURE_MESSAGE)
/home/njust/program/pcapplusplus-23.09-ubuntu-20.04-gcc-9.4.0-x86_64/lib/cmake/pcapplusplus/FindPCAP.cmake:53
(find_package_handle_standard_args)
解决:这个问题是sudo apt-get install libpcap-dev,见前面

1
2
3
cmake --build build
./example-app
Source IP is '10.0.0.138'; Dest IP is '10.0.0.1'

理解helloworld

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <IPv4Layer.h>
#include <Packet.h>
#include <PcapFileDevice.h>

int main(int argc, char* argv[])
{
// 实例化一个reader,读取1_packet.pcap,reader类为pcpp::PcapFileReaderDevice
pcpp::PcapFileReaderDevice reader("1_packet.pcap");
// 错误处理
if (!reader.open())
{
std::cerr << "Error opening the pcap file" << std::endl;
return 1;
}
// 实例化一个名为rawPacket的pcpp::RawPacket,用reader.getNextPacket(rawPacket)
pcpp::RawPacket rawPacket;
// 错误处理
if (!reader.getNextPacket(rawPacket))
{
std::cerr << "Couldn't read the first packet in the file" << std::endl;
return 1;
}

// parse the raw packet into a parsed packet
pcpp::Packet parsedPacket(&rawPacket);

// verify the packet is IPv4
if (parsedPacket.isPacketOfType(pcpp::IPv4))
{
// extract source and dest IPs
pcpp::IPv4Address srcIP = parsedPacket.getLayerOfType<pcpp::IPv4Layer>()->getSrcIPv4Address();
pcpp::IPv4Address destIP = parsedPacket.getLayerOfType<pcpp::IPv4Layer>()->getDstIPv4Address();

// print source and dest IPs
std::cout
<< "Source IP is '" << srcIP << "'; "
<< "Dest IP is '" << destIP << "'"
<< std::endl;
}

// close the file
reader.close();

return 0;
}

读取文件、读取原始包、parse包、验证协议并读取IP。


CMAKE_PREFIX_PATH:

  • 是一个环境变量或Makefile变量,CMake查找外部依赖的路径,当CMake寻找包、库、头文件、可执行文件或配置文件时,会依次搜索CMAKE_PREFIX_PATH列出的目录。

  • 影响所有CMakefile函数,包括find_package()、find_program()、find_library()、find_file()、find_path()、find_header()。

  • 逗号分割字符串,eg.

    1
    set(CMAKE_PREFIX_PATH "/opt/myCustomLibDir;/usr/local/myLibs")

数据平面开发工具包 DPDK

DPDK提供了优化的API和库,允许开发者在用户空间(User Space)高效地处理网络数据包,绕过Linux内核协议栈,从而减少延迟并提高报文处理速度。它适用于需要高性能网络功能虚拟化(NFVNFV)场景和高性能网络应用,如软件定义网络设备、负载均衡器、防火墙、路由器、数据包分析等。

我一直错认为DPDK只有windows有。直到
About DPDK | UbuntuGetting Started Guide for Linux — Data Plane Development Kit 24.03.0 documentation (dpdk.org)
DPDK的核心特性包括:

  1. 环境抽象层(EAL): 提供硬件抽象,使得库跨平台兼容,简化跨硬件平台开发。

  2. 轮询池和内存管理::高效内存管理,减少内存拷贝复制和零拷贝开销。

  3. 驱动支持: 支持** 高速网卡,如Intel Ethernet、虚拟化设备。

  4. 多核并行处理 利用,利用多核CPU资源。

  5. 测试和示例程 序:方便开发者快速上手。

DPDK是现代高性能网络应用开发的关键技术之一,特别在云基础设施和电信行业,它帮助实现低延迟、高吞吐量数据处理需求。


Git LFS artiface version control
ref:
api