linux下某程序中实现对进程的实时流量监控功能 100C

求大牛赐教

现在开发了一个程序,在linux下跑,想在里面加一个对特定进程的网络流量监控,实时统计进程流量大小

现在想到的办法就是用libpcap库,对应/proc里面文件按照pid 端口号 数据包 数据大小 进行统计得出当前流量大小。

目前有如下问题:
1.程序中已有功能中已经使用了libpcap去抓去一段数据包然后输出libpcap文件,如果按照上述办法,会不会造成再用libpcap采集数据包出问题?或者说libpcap可不可以多次同时抓取同一个数据包?
2.一定要在程序内部实现,目前知道的的可监听端口的软件,都有独立的显示界面,没有办法后台运行然后把统计信息放到我自己的程序里面,有没有可行的软件可以通过我自己的程序去调用然后获取统计信息?

要是都不行。。。linux怎么通过api获取进程网络流量信息或者数据包。。。

求解

3个回答

magicwpy
magicwpy 谢谢。但是我需要独立实现这一部分,工作在我自己的程序里面。链接中的程序都是单独有界面展示的,不符合我的需求
5 年多之前 回复

既然已有libcap,那么就抓同一份好了,只是你多分析一次。如果现有抓的包不满足的需求,那么就你再多抓电包。
无非就是一个时间内的包个数,然后计算流量。

最近解决了这个问题。在此分享一下吧。希望帮助到后来人。

简言之,通过一番查找和分析,最后通过查看netstat的源代码找到了解决问题的思路。下面先上我最终的一个结论,以帮助很有基础或者很着急的同学。

查看/proc/xx/net/snmp中的内容,可以判断数据的流入状态。
如我需要监控的是 1156 进程的udp端口的流量状态

cat /proc/1156/net/snmp |  awk '(f==0) {name=$1; i=2; while ( i<=NF) {n[i] = $i; i++ }; f=1; next} (f==1){ i=2; while ( i<=NF){ printf "%s%s = %d\n", name, n[i], $i; i++}; f=0} ' | grep Udp

再稍微修改一下,可以得到唯一输出。

cat /proc/1156/net/snmp | awk '(f==0) {name=$1; i=2; while ( i<=NF) {n[i] = $i; i++ }; f=1; next} (f==1){ i=2; str1="Udp:"; str2="InDatagrams"; while (i<=NF){ if(name==str1&&n[i]==str2){ printf "%d\n", $i; } i++}; f=0}'

TCP这个文件中同样可监控TCP的。下面是我的思考思路,如果想要解决的问题不是雷同的,可以借鉴一下。

netstat命令,有一个 s 的参数,是统计值,会一直增大,我没去太去深究他的上限。最少在1个小时内都在增加。
然后我去翻看了相关的netstat源码,发现netstat是查看的netstat和snmp两个文件。
所以我在代码中捕捉上面指令的输出,判断数值2s钟增加都很少的话,就说明网络波动,或者断开了。

不知道会不会帮助到你呢!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问