C++ 哪个进程拥有给定的端口(Linux内核)?

C++ 哪个进程拥有给定的端口(Linux内核)?,c++,linux-kernel,network-programming,netfilter,C++,Linux Kernel,Network Programming,Netfilter,我正在为Linux编写一个简单的应用层防火墙(目前没有什么特别之处,只是我需要的东西)。由于iptables的所有者模块不够,我决定使用libnetfilter_队列来实现它。在我的防火墙(C/C++应用程序)中的某个时刻,我需要决定是否接受具有给定src/dest端口的数据包。现在问题来了。是否有任何简单/快速的方法可以知道哪个进程拥有给定的端口 基本上,我需要一个函数 pid_t port2pid(u_int16_t port) 似乎在用户空间中执行此操作的唯一方法是解析/proc层次结构

我正在为Linux编写一个简单的应用层防火墙(目前没有什么特别之处,只是我需要的东西)。由于iptables的所有者模块不够,我决定使用libnetfilter_队列来实现它。在我的防火墙(C/C++应用程序)中的某个时刻,我需要决定是否接受具有给定src/dest端口的数据包。现在问题来了。是否有任何简单/快速的方法可以知道哪个进程拥有给定的端口

基本上,我需要一个函数

pid_t port2pid(u_int16_t port)
似乎在用户空间中执行此操作的唯一方法是解析
/proc
层次结构。我不想那样做,因为所有短暂的港口可能都很慢。内核在TCP堆栈中必须有某种映射端口->进程。有没有可能通过自定义内核模块来实现这一点?也许有人能给我指出完成同样任务的另一种方法?

回答自我

文件
proc/net/tcp
由内核模块
tcp\u diag
提供。它提供了所有TCP套接字及其状态的现成列表


将套接字映射到进程的最佳方法是通过
/proc/*/fd/*
中的文件描述符,因为套接字可能由同时使用它们的许多进程/线程共享。iproute2包中的
ss
实用程序的源代码是学习这方面知识的好地方。

您可能也对/proc/net/tcp感兴趣,但您应该知道,用户空间程序可以共享fd,相互传输fd,并对其进行dup(),因此在内核中可能存在从fd+pid到内核filedescriptor的映射,而不是相反。我看过的所有其他答案似乎都没有提到
/proc/net
。此外,我还发现了
ss
utulity及其源代码非常有趣。谢谢你的提示。不幸的是,
ss
也为套接字所有者解析
/proc/*/fd/*
。当数据到达给定端口时,内核如何知道向哪个进程发送数据?套接字可能是共享的,但内核不知怎么知道如何处理数据。我不敢相信它会按顺序查看每个进程。这对于SO注释来说太多了,甚至对于SO问题来说可能也不太好,但请记住,要与内核交互,用户空间使用fd参数启动任何操作,内核不会“发送”任何东西。为什么速度不合适?我只是希望朝着正确的方向推进。您是对的,userspace启动发送,但是如果数据来自网络(比如浏览器的HTTP回复),该怎么办呢。然后,端口号是到等待数据的实际进程的唯一链接。因此,必须有一种将端口映射到进程的方法。