通过libcap监控相关ip和端口流量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pcap.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>#define SAMPLE_COUNT 0 // 0表示无限采样
#define TARGET_MAX 32
#define INTERVAL 2 // 采样间隔(秒)typedef struct {const char *ip;int port;unsigned long long bytes_sent;unsigned long long bytes_recv;double send_mbps;double recv_mbps;
} target_t;target_t targets[TARGET_MAX];
int target_count = 0;
int link_offset = 14;
volatile int running = 1;void signal_handler(int sig) {running = 0;
}void add_target(const char *ip, int port) {if(target_count >= TARGET_MAX) {fprintf(stderr, "Too many targets!\n");exit(1);}targets[target_count].ip = ip;targets[target_count].port = port;targets[target_count].bytes_sent = 0;targets[target_count].bytes_recv = 0;targets[target_count].send_mbps = 0.0;targets[target_count].recv_mbps = 0.0;target_count++;
}int get_link_offset(pcap_t *handle) {int linktype = pcap_datalink(handle);if(linktype == DLT_EN10MB) return 14;else if(linktype == DLT_LINUX_SLL) return 16;else {fprintf(stderr, "Unsupported datalink type: %d\n", linktype);exit(1);}
}void packet_handler(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes) {(void)user;if (h->len < link_offset + 20) return;struct ip *ip_hdr = (struct ip*)(bytes + link_offset);if(ip_hdr->ip_v != 4) return;int ip_hdr_len = ip_hdr->ip_hl * 4;if (h->len < link_offset + ip_hdr_len + 20) return;struct tcphdr *tcp_hdr = (struct tcphdr*)((u_char*)ip_hdr + ip_hdr_len);char src_ip[16], dst_ip[16];inet_ntop(AF_INET, &ip_hdr->ip_src, src_ip, sizeof(src_ip));inet_ntop(AF_INET, &ip_hdr->ip_dst, dst_ip, sizeof(dst_ip));// 使用标准的TCP头字段名int src_port = ntohs(tcp_hdr->source);int dst_port = ntohs(tcp_hdr->dest);for(int i = 0; i < target_count; i++) {// 本机发向目标if(strcmp(dst_ip, targets[i].ip) == 0 && dst_port == targets[i].port) {targets[i].bytes_sent += h->len;}// 目标发向本机if(strcmp(src_ip, targets[i].ip) == 0 && src_port == targets[i].port) {targets[i].bytes_recv += h->len;}}
}void print_header() {printf("\033[2J\033[H");printf("================================================================================\n");printf(" 实时带宽监控 (基于libpcap) - 端口: 9092\n");printf("================================================================================\n");printf("%-20s %-8s %-12s %-12s %-8s\n", "IP地址", "端口", "发送(Mbps)", "接收(Mbps)", "总带宽(Mbps)");printf("--------------------------------------------------------------------------------\n");
}void print_stats() {double total_send_mbps = 0.0;double total_recv_mbps = 0.0;int active_targets = 0;for(int i = 0; i < target_count; i++) {double total_mbps = targets[i].send_mbps + targets[i].recv_mbps;printf("%-20s %-8d %-12.2f %-12.2f %-8.2f\n",targets[i].ip, targets[i].port,targets[i].send_mbps,targets[i].recv_mbps,total_mbps);total_send_mbps += targets[i].send_mbps;total_recv_mbps += targets[i].recv_mbps;if (targets[i].send_mbps > 0 || targets[i].recv_mbps > 0) {active_targets++;}}printf("--------------------------------------------------------------------------------\n");printf("总计: %d个目标 | 总发送: %.2f Mbps | 总接收: %.2f Mbps | 总带宽: %.2f Mbps\n",active_targets, total_send_mbps, total_recv_mbps, total_send_mbps + total_recv_mbps);printf("================================================================================\n");printf("按 Ctrl+C 停止监控\n");
}int main() {signal(SIGINT, signal_handler);// 添加目标 IP:Portadd_target("10.252.12.100", 9092);add_target("10.252.134.67", 9092);add_target("10.252.134.68", 9092);add_target("10.252.134.69", 9092);add_target("10.252.134.70", 9092);add_target("10.252.134.71", 9092);add_target("10.52.16.68", 9092);add_target("10.52.16.69", 9092);add_target("10.52.16.70", 9092);add_target("10.52.16.71", 9092);add_target("10.52.16.72", 9092);add_target("10.252.12.83", 9092);add_target("10.252.12.84", 9092);add_target("10.252.12.85", 9092);add_target("10.252.12.86", 9092);add_target("10.252.12.87", 9092);add_target("10.252.12.88", 9092);add_target("10.252.12.89", 9092);add_target("10.252.145.44", 9092);add_target("10.252.12.99", 9092);char errbuf[PCAP_ERRBUF_SIZE];// 直接使用 eth0const char *iface = "eth0";// 显示可用网卡pcap_if_t *alldevs;if (pcap_findalldevs(&alldevs, errbuf) == 0) {printf("可用网卡:\n");for(pcap_if_t *d = alldevs; d; d = d->next) {printf(" %s", d->name);if (d->description) printf(" (%s)", d->description);printf("\n");}pcap_freealldevs(alldevs);}printf("使用网卡: %s\n", iface);pcap_t *handle = pcap_open_live(iface, 65536, 1, 1000, errbuf);if(!handle) {fprintf(stderr, "pcap_open_live failed on %s: %s\n", iface, errbuf);fprintf(stderr, "请检查网卡名称是否正确,或尝试使用 'any'\n");return 1;}link_offset = get_link_offset(handle);// 构建 BPF 过滤器char filter_exp[2048] = "tcp and (";for(int i = 0; i < target_count; i++) {char tmp[64];snprintf(tmp, sizeof(tmp), "host %s and port %d", targets[i].ip, targets[i].port);if (i > 0) strcat(filter_exp, " or ");strcat(filter_exp, tmp);}strcat(filter_exp, ")");printf("使用过滤器: %s\n", filter_exp);struct bpf_program fp;if(pcap_compile(handle, &fp, filter_exp, 1, PCAP_NETMASK_UNKNOWN) == -1) {fprintf(stderr, "pcap_compile failed: %s\n", pcap_geterr(handle));pcap_close(handle);return 1;}if(pcap_setfilter(handle, &fp) == -1) {fprintf(stderr, "pcap_setfilter failed: %s\n", pcap_geterr(handle));pcap_close(handle);return 1;}printf("开始监控 %d 个目标,采样间隔: %d 秒...\n", target_count, INTERVAL);printf("按 Ctrl+C 停止监控\n\n");sleep(2);int sample_num = 0;unsigned long long prev_sent[TARGET_MAX], prev_recv[TARGET_MAX];for(int i = 0; i < target_count; i++) {prev_sent[i] = targets[i].bytes_sent;prev_recv[i] = targets[i].bytes_recv;}while(running) {sample_num++;time_t start = time(NULL);while(time(NULL) - start < INTERVAL && running) {int ret = pcap_dispatch(handle, 100, packet_handler, NULL);if (ret == -1) {fprintf(stderr, "pcap_dispatch error: %s\n", pcap_geterr(handle));break;}usleep(1000);}if (!running) break;for(int i = 0; i < target_count; i++) {unsigned long long sent_diff = targets[i].bytes_sent - prev_sent[i];unsigned long long recv_diff = targets[i].bytes_recv - prev_recv[i];targets[i].send_mbps = (sent_diff * 8.0) / INTERVAL / 1000000.0;targets[i].recv_mbps = (recv_diff * 8.0) / INTERVAL / 1000000.0;prev_sent[i] = targets[i].bytes_sent;prev_recv[i] = targets[i].bytes_recv;}print_header();print_stats();if (SAMPLE_COUNT > 0 && sample_num >= SAMPLE_COUNT) {break;}}pcap_close(handle);printf("\n监控已停止。共采样 %d 次。\n", sample_num);return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/976189.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
基于小波变换的数字信号调制识别
基于小波变换的数字信号调制识别系统实现,包括信号生成、特征提取、分类模型训练和识别评估:
import numpy as np
import matplotlib.pyplot as plt
import pywt
from sklearn.model_selection import train_test_sp…
T701316 重排 (rearrange) 赛后题解
多校联训 251124 T2 题解题目传送门
思路
静态原问题给定长度为 \(n\) 的正整数序列 \(a\),你可以任意排列序列 \(a\),使得以下式子的值最大:
\[f(a)=\sum_{i=2}^{n} |a_{i}-a_{i-1}|
\]
发现有绝对值求最大值,考虑…
计算机大信息毕业设计推荐:基于大数据的前列腺患者风险数据可视化分析架构【python+Hadoop+spark】【数据分析、python毕设项目、毕设必备项目、毕设】
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
2025年山东锅炉能效检测机构权威推荐榜单:山东焊缝检测公司/山东焊接工艺评定机构精选
锅炉能效检测作为工业设备节能评估的核心环节,其专业性与权威性直接关系到企业的合规运营与能效提升。根据检测行业数据分析,工业锅炉检测市场正伴随"双碳"政策推进而持续增长。本文基于资质认证、技术能力…
AI智能体编程的未来方向有哪些? - 详解
AI智能体编程的未来方向有哪些? - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…
题解:SP32895 STRMATCH - Match me if you can
简要题意:给定一个文本串 \(S\),以及若干个模式串 \(T\),按顺序输出每个模式串 \(T\) 在文本串 \(S\) 中出现的次数。NOIP 模拟赛出了加强版,过来发个题解。提供一种在线 \(\mathcal O(|S|\sqrt{\sum |T|})\) 的做…
机器人技术如何将电子垃圾变为科技金矿
丹麦研究人员开发出AI驱动的机器人系统,可自动更换笔记本屏幕并翻新设备。该系统结合视觉识别技术,能适应不同型号笔记本,旨在解决电子垃圾危机并创造商业价值,预计到2030年全球电子垃圾将达8000万吨。机器人技术如…
决策树训练加速技术突破
介绍一种新型梯度提升决策树训练方法,通过特征分组和二分搜索算法将训练时间减少50%-99%,同时保持模型准确性,特别适用于多任务学习场景。加速决策树训练的新方法
技术背景
梯度提升决策树是一种在大型在线搜索应用…
2025年PP储罐厂家权威推荐榜单:PPH储罐/PP立式储罐/PPH搅拌罐源头厂家精选
根据QYResearch报告出版商调研统计,2031年全球PP储罐市场销售额预计将达到 亿元。在化工、环保、新能源等行业快速发展的推动下,PP储罐以其卓越的耐腐蚀性和轻量化设计,已成为储存腐蚀性介质的核心设备。
本文将基于…
2025年PPH储罐厂家权威推荐榜单:PP储罐/PP立式储罐/PPH搅拌罐源头厂家精选
一台优质的PPH储罐,其无焊缝的螺旋缠绕罐体,能有效应对强酸强碱的长期腐蚀,将传统焊接储罐2-3年就可能出现的渗漏风险延长至15年以上。
在化工、环保、新能源等行业,PPH(聚丙烯)储罐因其卓越的耐腐蚀性和轻量化设…
KSVD的稀疏编码去噪
KSVD(K-Singular Value Decomposition)是一种用于稀疏表示的字典学习算法,广泛应用于信号处理和图像处理中的去噪任务。
1. KSVD字典学习
function [D, X] = ksvd(Y, K, maxIter)% KSVD字典学习% 输入:% Y - 输入…
25.11.25随笔联考总结
考试
开考前去接了个水。准时开题。
首先看了一眼 T1 我觉得是贪心,然后分讨几种情况就可以了。我想了估计没有 2 分钟直接扔了去看 T2,当时 7:51。T2 想了很久没有啥思路,此时 8:10,我 T2 只会 45pts,先看后面的…
【Springer出版 | EI、Scopus检索】第三届人工智能安全与隐私国际学术会议(AISP 2025)
第三届人工智能安全与隐私国际学术会议(AIS&P 2025)将于2025年12月5-7日在中国广州举行。【会议召开有保障、会议历史良好、沿用往届出版社、见刊检索有保障】
第三届人工智能安全与隐私国际学术会议(AIS&P…
四方通信管理机程序实现方案
四方通信管理机程序实现方案,基于其硬件架构和通信规约特性一、硬件架构与核心组件
1. 主控模块处理器:采用工业级32位DSP2812芯片(主频150MHz),支持浮点运算
操作系统:嵌入式Windows NT/Linux双系统架构,支持多…
2025 最新虹膜掌静脉识别厂家权威推荐榜:企业测评结果揭晓,含识别机 / 门禁 / 通道闸等产品优选签到设备/模组/考勤设备/箱/门禁/更衣柜/柜公司推荐
引言
在全球数字化浪潮推动下,身份识别技术已成为安防、金融、医疗等关键领域的核心支撑。传统生物识别技术在复杂环境适应性、防伪安全性上的短板日益凸显,虹膜掌静脉识别凭借与生俱来的唯一性、终身稳定性及强防伪…
「笔记分享」迪文串口屏基础GUI开发流程
一、前言
迪文的资料较为混乱,花费了大量的时间研究。首先:迪文芯片分为T5和T5L系列,并不兼容,在T5L内同时分为T5L0\T5L1\T5L2,
但在官网最新的<迪文 T5L ASIC 应用开发指南.pdf>版本为V1.1,这一参考资料中…
OIFC 2025.11.25 模拟赛总结
生日当天还有模拟赛(
T1 Pocky游戏
题意简述
Mdk 和 Hmr 正在吃 Pocky,她们感到有些无聊,于是决定玩一个小游戏。
现在有一根长度为 \(n\) 的 Pocky,其中从左往右数第 \(i\) 单位长度 Pocky 的美味值为 \(a_i\)。现…
企业微信会话内容存档功能测试,能获取成员或客户以及群消息内容,通过拉取可以将消息备份到自己服务器
wx:llike620
gofly.v1kf.com
经过几天的仔细测试和摸索,我终于把企业微信客服的会话内容存档功能给彻底搞明白了。这个功能看似强大,但实际上有不少“坑”,今天就来和大家分享我的发现。
会话存档能做什么?
当我们…