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

标签 c++ linux-kernel network-programming netfilter

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

基本上,我需要一个函数

pid_t port2pid(u_int16_t port)

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

最佳答案

self 回答。

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

将套接字映射到进程的最佳方法是通过 /proc/*/fd/* 中的文件描述符,因为套接字可能会被并发使用它们的许多进程/线程共享。来自 iproute2 包的 ss 实用程序的源代码是学习这些东西的好地方。

关于c++ - 哪个进程拥有给定端口(Linux 内核)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24554696/

相关文章:

ios - NSURLConnection 和持久连接

c++ - 在 C++ 中调用 system() 的问题

c++ - 如何在 C++ 中向该程序添加 while 循环

linux - 构建 Linux 内核时通过 -S 选项生成汇编文件

c - 如何编写从汇编代码调用的 C 函数

sockets - SOCKS和socket有什么关系?

c++ - 如何删除正在运行程序的 Win32 桌面,并终止这些程序?

c++ - 包括 Eigen

在 LINUX 中检查简单的字符设备读/写函数

c++ - 优化网络负载大时接收数据包的流程