哪个进程拥有给定的端口(Linux内核)
Which process owns the given port (Linux kernel)?
我正在为Linux编写一个简单的应用层防火墙(现在没什么特别的,只是我需要的东西)。由于iptables的所有者模块是不够的,我决定使用libnetfilter_queue。在我的防火墙(C/c++应用程序)的某个点,我需要决定是否接受具有给定src/dest端口的数据包。现在问题来了。是否有任何简单/快速的方法知道哪个进程拥有给定的端口?
基本上,我需要一个函数pid_t port2pid(u_int16_t port)
在用户空间中,似乎唯一的方法是解析/proc
层次结构。我不想这样做,因为所有的临时端口可能会很慢。内核必须在TCP堆栈中有某种映射端口->进程。是否有可能通过定制内核模块来实现?也许有人能给我指出完成同样任务的另一种方法?
回答自我
文件proc/net/tcp
由内核模块tcp_diag
提供。它提供了所有TCP套接字及其状态的可用列表。
将套接字映射到进程的最佳方法是通过/proc/*/fd/*
中的文件描述符,因为套接字可能由并发使用它们的许多进程/线程共享。从iproute2包获取ss
实用程序的源代码是学习这些东西的好地方。
相关文章:
- 如何让ASan使用4.12.3 Linux内核?
- Linux 内核事件:timeval 或 timespec
- 在纯C++中实现 Linux 内核的 __is_constexpr (ICE_P) 宏
- 如何修复在 Linux 内核 SPI 驱动程序中始终无法验证的 SPI 驱动程序
- 使用 __builtin_expect() 或 Linux 内核时可能和不太可能时"very likely"多少
- C func签名Linux内核:Include/Linux/Sched.h
- 在C++中获取 Linux 内核模块的详细信息
- 清除Linux内核链接列表
- pthread_create Linux 内核 2.4.20 和 2.4.36 的差异
- Mac/IOS 是否使用与 Linux 内核相同的 sys/socket.h?
- linux内核.h文件中定义的宏
- 如何将 C/C++ 应用程序移植到旧版 Linux 内核版本
- 当多个高优先级线程在多个内核上运行时,Linux内核没有响应
- 如何定义几个源文件访问的Linux内核变量
- linux内核模块对c++异常的支持
- 在c++中使用来自linux内核头ioprio_h的ioprio_set()
- 不使用Inotify从Linux内核读取文件系统事件
- 哪个进程拥有给定的端口(Linux内核)
- 解析 Linux 内核文件时"Idle Service Error semantic-idle-summary-idle-function - Arithmetic error" cedet 语义错误
- 在32位linux内核上使用c++在堆上分配超过2GB的空间