获取tcp/udp端口对应的进程pid

可能有一些朋友想要做一些监视流量工具却不知道如何根据端口获取到进程的PID,如果你搜了一圈也没有找到满意的答案,希望我的这个文章可以帮到你。


1、获取当前活动的TCP/UDP端口值。

你会有许多方法获取此值,这里不多废话了。(我用的方法是通过raw socket进行抓包分析,你也可以用libpcap库实现)。假设当前我发现一个本地端口为54351的tcp端口。

当前状态:tcp_port/udp_port


2、获取端口的inode值。

假设你用自己的方法获取到了当前活动的tcp端口,此时你需要找到此端口对应的inode节点值。怎么获得呢?在这里/proc/net/tcp(对于udp是/proc/net/udp)。这个文件中存储的主要信息是:本地地址,本地端口,远程地址,远程端口,链接状态,发送队列,接收队列,UID,inode等信息。记住这个值,它就是我们需要的东西。

假设端口号为 54351 的记录中inode字段为 193738

当前状态:tcp_port/udp_port -> inode


3、遍历所有进程的所有fd(fd = 文件描述符)

    在到/proc/目录你会看到很多以数字命名的文件夹,这些文件夹里就是系统当前运行进程的相关信息。文件名字这些数字就是进程的pid,比如叫做“1”的文件夹里就是init进程的相关信息。

假设我的google-chrome进程pid为102。我进入102目录(即当前我处在/proc/102/目录)后,能看到一个叫做fd的目录。进入fd目录。能看到很多用数字命名的文件,执行“ls -l”可以看到

niu@niu:/proc/102/fd$ ls -l
total 0
l-wx------ 1 niu niu 64 2011-11-29 10:41 31 -> pipe:[11903]
lr-x------ 1 niu niu 64 2011-11-29 10:41 32 -> /opt/google/chrome/chrome.pak
lrwx------ 1 niu niu 64 2011-11-29 10:41 33 -> anon_inode:[eventpoll]
lr-x------ 1 niu niu 64 2011-11-29 10:47 13 -> pipe:[8449]
l-wx------ 1 niu niu 64 2011-11-29 10:47 14 -> pipe:[8449]
lr-x------ 1 niu niu 64 2011-11-29 10:47 15 -> pipe:[8450]
l-wx------ 1 niu niu 64 2011-11-29 10:47 16 -> pipe:[8450]
lrwx------ 1 niu niu 64 2011-11-29 10:47 2 -> /dev/null
lrwx------ 1 niu niu 64 2011-11-29 10:47 3 -> anon_inode:[eventfd]
lr-x------ 1 niu niu 64 2011-11-29 10:47 4 -> pipe:[6952]
lrwx------ 1 niu niu 64 2011-11-29 10:47 7 -> /dev/null
lrwx------ 1 niu niu 64 2011-11-29 10:47 8 -> socket:[193738]

其中有一条为:

lrwx------ 1 niu niu 64 2011-11-29 10:47 8 -> socket:[193738]
方括号中的值就此进程占用的socket的inode值, 解析出此值与 前面获得到的193738比较可得出结论:54351端口属于进程102。

当前状态:tcp_port/udp_port -> inode       ==       inode<-pid

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值