C語言實現TcpDump

一、

在 C 語言中實現 TCP 抓包功能,通常可以使用 libpcap 庫。libpcap 是一個廣泛使用的網絡抓包庫,它提供了捕獲網絡數據包的接口。
libpcap 是一個廣泛使用的 C 語言庫,用于捕獲和過濾網絡數據包。它提供了一個通用接口,用于訪問數據鏈路層的協議,使用戶能夠在各種平臺上實現網絡流量捕獲功能。

二、準備

安裝 libpcap:在 Linux 系統中,可以使用以下命令安裝

sudo apt-get install libpcap-dev

或者
下載、編譯源碼

git clone https://github.com/the-tcpdump-group/libpcap

可以查看官方文檔

https://www.tcpdump.org/

三、代碼

#include <stdio.h>
#include <stdlib.h>
#include <pcap/pcap.h>//頭文件包含#define SNAP_LEN 65535
#define PROMISC  1
#define TIMEOUT  1000             // ms
#define BUFSIZE  4 * 1024 * 1024  // 4MBtypedef struct {pcap_dumper_t *dumper;  // 用于保存數據包的句柄time_t start_time;       // 記錄當前文件的起始時間long written_bytes;      // 當前文件已寫入的字節數int file_index;          // 文件索引,用于防止同一秒生成兩個文件
} capture_context_t;//抓到包后具體的處理,根據帶入的參數和自己需要的規則進行編寫功能
void packet_handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes) {capture_context_t *ctx = (capture_context_t *)user;time_t now = time(NULL);long packet_size = h->caplen;// 更新寫入字節數ctx->written_bytes += packet_size;// 計算是否需要切換文件if (difftime(now, ctx->start_time) >= MAX_DURATION_SEC ||ctx->written_bytes >= MAX_FILE_SIZE) {// 關閉舊文件pcap_dump_close(ctx->dumper);// 打開新文件char filename[256];ctx->file_index += 1;generate_filename(filename, sizeof(filename), ctx->file_index);ctx->dumper = pcap_dump_open(ctx->handle, filename);ctx->start_time = now;ctx->written_bytes = 0;printf("🆕 Switched to new file: %s\n", filename);}// 寫入當前包pcap_dump((u_char *)ctx->dumper, h, bytes);
}int main() {char errbuf[PCAP_ERRBUF_SIZE];//存放錯誤打印pcap_t *handle;pcap_dumper_t *dumper;struct bpf_program fp;bpf_u_int32 net = 0, mask = 0;//查找當前系統中一個默認的抓包網絡設備名,需要確認是否有權限const char *dev = pcap_lookupdev(errbuf);if (!dev) {fprintf(stderr, "Device not found: %s\n", errbuf);return 1;}const char *filter_exp = "tcp port 80"; // 設置過濾器的規則,可以換成 "udp", "ip", "host 192.168.1.1", 等等const char *outfile = "output.pcap";    // 輸出文件printf("Using device: %s\n", dev);// 獲取網絡地址 & 掩碼(用于過濾器編譯)if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) {fprintf(stderr, " Could not get netmask for %s: %s\n", dev, errbuf);net = 0;mask = 0;}//創建并配置抓包句柄handle = pcap_create(dev, errbuf);if (!handle) {fprintf(stderr, " pcap_create failed: %s\n", errbuf);return 1;}//設置抓包長度pcap_set_snaplen(handle, SNAP_LEN);//混雜模式,當網絡接口處于混雜模式時,它會接收所有經過的數據包,而不僅僅是發送給它的包。pcap_set_promisc(handle, PROMISC);//設置捕獲數據包的超時時間,以毫秒為單位,表示在沒有接收到數據包的情況下,等待的最長時間pcap_set_timeout(handle, TIMEOUT);//設置緩沖區大小,增大緩沖區可以提高捕獲性能,尤其是在高流量環境中,可以防止數據包丟失。pcap_set_buffer_size(handle, BUFSIZE);//激活剛剛設置的參數if (pcap_activate(handle) != 0) {fprintf(stderr, " pcap_activate failed: %s\n", pcap_geterr(handle));return 1;}//編譯 BPF(Berkeley Packet Filter)過濾器表達式,將過濾規則轉化為庫格式if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) {fprintf(stderr, " Couldn't parse filter: %s\n", pcap_geterr(handle));return 1;}//應用過濾規則if (pcap_setfilter(handle, &fp) == -1) {fprintf(stderr, " Couldn't install filter: %s\n", pcap_geterr(handle));return 1;}// 打開輸出文件dumper = pcap_dump_open(handle, outfile);if (!dumper) {fprintf(stderr, " Couldn't open dump file: %s\n", pcap_geterr(handle));return 1;}capture_context_t ctx = { .dumper = dumper };printf(" Saving packets to: %s\n", outfile);//抓多少包,抓到的包怎么處理packet_handlerpcap_loop(handle, 10, packet_handler, (u_char *)&ctx); // 抓 10 個包// 清理資源pcap_dump_close(dumper);pcap_freecode(&fp);pcap_close(handle);printf(" Capture complete. Output saved to: %s\n", outfile);return 0;
}

編譯、需要進行庫的鏈接,以及操作權限

gcc -o pcap_loop_example pcap_loop_example.c -lpcap
sudo ./pcap_loop_example

#四、Shell 腳本(自動添加權限)
可以當做自啟動腳本

#!/bin/bash
# file: grant_pcap_cap.shTARGET="./pcap_loop_example "if [ ! -f "$TARGET" ]; thenecho "? $TARGET not found. Please compile it first."exit 1
fiecho "🔧 Adding capability to $TARGET ..."
sudo setcap cap_net_raw,cap_net_admin=eip $TARGETecho "? Done. You can now run it as a normal user:"
echo "   $TARGET"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76555.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76555.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76555.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark-Core編程

sortByKey算子&#xff1a;對(K, V)型RDD按key排序&#xff0c;K需實現Ordered接口&#xff0c;可指定升序或降序及分區數。 join算子&#xff1a;連接兩個(K, V)和(K, W)型RDD&#xff0c;返回(K, (V, W))型RDD 。 leftOuterJoin算子&#xff1a;類似SQL左外連接&#xff0c;返…

閱讀MySQL實戰45講第9天

目錄 一、你的 SQL 語句為什么變“慢” 二、什么情況會引發數據庫的 flush 過程&#xff1f; 三、分析上面四種場景對性能的影響 四、InnoDB 刷臟頁的控制策略 五、原作者小結&#xff1a; 引言&#xff1a; 一條 SQL 語句&#xff0c;正常執行的時候特別快&#xff0c;但是有時…

cin,cin.get(),getchar(),getline(),cin.get line()異同點

文章目錄 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin &#xff08;1&#xff09;cin>>等價于cin.operator>>()&#xff0c;即調用成員函數operator>>()進行讀取數據。 &#xff08;2&#xff09;當cin>>從緩沖區中讀取數據時&…

VMware虛擬機Ubuntu磁盤擴容

VMware中操作&#xff1a; 選擇要擴容的虛擬機&#xff0c;點擊編輯虛擬機設置 打開后點擊磁盤——>點擊擴展&#xff08;注意&#xff1a;如果想要擴容的話需要刪除快照&#xff09; 調整到你想要的容量 點擊上圖的擴展——>確定 然后我們進到虛擬機里面 首先&#…

卷積神經網絡(CNN)可視化網站匯總

深度學習 文章目錄 深度學習前言CNN ExplainerDeep Learning PlaygroundConvNetJSUnderstanding CNN with Interactive Visualizations3Blue1Brown Neural Networks YouTube PlaylistDistill.pubTensorFlow CNN Visualization (TensorBoard)NN-SVGOpenAI Microscope 前言 匯總…

實習技能記錄【3】-----Git操作

1. Git是什么 Git 是一個分布式版本控制系統 (Distributed Version Control System, DVCS)。 它的核心目標是跟蹤文件的變化&#xff0c;讓你能夠隨時記錄、回溯、協作和管理你的項目。 2. 介紹 2.1 Git 工作區、暫存區、本地倉庫介紹 區域名稱英文名說明相關命令工作區Wor…

藍橋杯單片機刷題——按鍵設置當前采集距離為距離參數

設計要求 驅動超聲波傳感器&#xff0c;啟動距離測量功能,并將其結果顯示到數碼管上。 按鍵“S5”定義為參數按鍵&#xff0c;按下S5按鍵&#xff0c;設備自動將當前采集的距離數據作為距離參數&#xff1b; 若測量的距離數據超過距離參數&#xff0c;指示燈L1點亮&#xff…

KV Cache大模型推理加速功能

KV Cache KV Cache是大模型標配的推理加速功能&#xff0c;也是推理過程中&#xff0c;顯存資源巨大開銷的元兇之一。在模型推理時&#xff0c;KV Cache在顯存占用量可達30%以上。 目前大部分針對KV Cache的優化工作&#xff0c;主要集中在工程上。比如著名的VLLM&#xff0c…

Windows 圖形顯示驅動開發-WDDM 2.0功能_上下文監視

功能概述 上下文監視機制是GPU與CPU協同計算的核心同步技術&#xff0c;通過受監視圍欄&#xff08;Monitored Fence&#xff09;實現跨硬件單元的高效協調。其核心目標是解決以下場景的同步需求&#xff1a; GPU引擎間同步&#xff1a;例如在多渲染管線中&#xff0c;后處理…

基于YOLOv8的機場跑道異物檢測識別系統:提升航空安全的新一代解決方案(主頁有源碼)

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ??? ????????? ?? 1. 機場跑道異物檢測領域概述 機場跑道異物(Foreign Object Debris, FOD)是指存在于機場跑道、滑行道等關…

網絡協議學習

最近在適配ESP32的網絡驅動&#xff0c;借此機會先學習一下網絡通信協議。 以太網幀、IP包及TCP與UDP的報文格式一文讀懂網絡報問中的檢驗和&#xff08;checksum&#xff09;—— 原理舉例代碼 提問騰訊元寶提示詞&#xff1a; TCP窗口是干什么的擁塞窗口是什么的

fit 轉 gpx

新增 fit 轉 gpx 功能 https://fittools.cc/home/fit2gpx

C++ I/O 性能優化指南

在高性能計算和大規模數據處理中&#xff0c;I/O 性能優化是提升系統整體效率的關鍵環節。C 作為一種高性能編程語言&#xff0c;提供了豐富的工具和機制來優化 I/O 操作。本文將詳細介紹在 Linux 環境下&#xff0c;如何通過代碼層面的優化、系統調用的選擇以及多線程技術等手…

Python中內置的數據結構類型詳析(內置數據容器)

目錄 1. 元組&#xff08;Tuple&#xff09;??2. 列表&#xff08;List&#xff09;?3. 字典&#xff08;Dict&#xff09;4. 集合&#xff08;Set&#xff09;??5. 字符串&#xff08;Str&#xff09;6. 隊列&#xff08;Queue&#xff09;與棧&#xff08;Stack&#xf…

Socket多路復用網絡編程應用總結

Socket多路復用網絡編程應用總結 概述 ? 傳統I/O模型的局限性&#xff1a;傳統阻塞式I/O模型每次僅在一個文件描述符&#xff08;File Descriptor, FD&#xff09;上執行I/O操作&#xff0c;導致程序需等待單個操作完成&#xff0c;無法高效處理多連接場景&#xff08;如高并…

安卓開發提示Android Gradle plugin錯誤

The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模塊級 build.gradle&#xff08;如果有獨立配置&#xff09;&#xff1a;…

【C++初階】--- vector容器功能模擬實現

1.什么是vector&#xff1f; 在 C 里&#xff0c;std::vector 是標準模板庫&#xff08;STL&#xff09;提供的一個非常實用的容器類&#xff0c;它可以看作是動態數組 2.成員變量 iterator _start;&#xff1a;指向 vector 中第一個元素的指針。 iterator _finish;&#x…

分布式鎖在秒殺場景中的Python實現與CAP權衡

目錄 一、分布式鎖的前世今生 二、秒殺系統的 “硬核” 挑戰 三、Python 實現分布式鎖的 “實戰演練” Redis 實現:快準狠 ZooKeeper 實現:穩如老狗 數據庫實現:老實本分 四、CAP 理論的 “三角戀” 五、性能優化的 “錦囊妙計” 鎖粒度控制:粗細有道 超時機制:別…

企業級開發SpringBoost玩轉Elasticsearch

案例 Spring Boot 提供了 spring-data-elasticsearch 模塊&#xff0c;可以方便地集成 Elasticsearch。 下面我們將詳細講解如何在 Spring Boot 中使用 Elasticsearch 8&#xff0c;并提供示例代碼。 1. 添加依賴: 首先&#xff0c;需要在 pom.xml 文件中添加 spring-data-e…

磐石云智能語音客服系統——技術革新引領服務新體驗

在人工智能技術飛速發展的今天&#xff0c;企業對于智能化客戶服務的需求日益增長。磐石云智能語音客服系統憑借其前沿技術架構與深度場景適配能力&#xff0c;正在重新定義人機交互的邊界。本文將深入解析該系統如何通過技術創新實現服務效率與體驗的雙重突破。 一、意圖識別…