tre*_*ows 7 c unix sockets linux tcp
每次在我的Linux服务器上创建新的TCP套接字时,我都需要调用一个函数.架构代码是:
do {
new_socket = block_until_new_socket_created();
do_something(new_socket);
} while (true);
Run Code Online (Sandbox Code Playgroud)
问题是,在正在执行代码的UNIX/Linux服务器上创建新的tcp套接字时,是否有任何库/工具/函数需要通知?
编程代码是C.
老问题,但至少有两种方法可以做到这一点:
1)使用审计子系统
您可以配置 auditd 和 Linux 审计子系统,以便在每次发生任何系统调用时记录一条消息。它将包括时间戳和调用过程。挂钩 'connect()' 和/或 'bind()' 的东西应该可以满足您对套接字的需求。这就是auditd 的设计目的。
2) 使用 ip_conntrack (netfilter/ip_tables)
使用 libnetfilter-conntrack 库(使用 ip_conntrack 内核模块)之类的东西将根据需要为您提供所有新套接字的通知。但是,它只会告诉您本地和远程地址/端口和时间戳,而不是 inode。这意味着要将其关联回 pid,您必须首先从 conntrack 读取通知,然后解析 /proc/net/{tcp/udp/whatever} 文件中的文件以找到套接字和 inode,然后解析所有 /proc/$pid/fd/* 文件以找出哪个 pid 拥有该 inode。在每一步中,您都必须希望在这三步过程中读取文件时套接字没有消失。这种系统由 netsniff-ng utils 包中的 flowtop 使用。
所有系统都需要root,尽管一旦由root 配置了auditd,如果您愿意,非root 也可以读取日志。我认为您会希望尽可能使用 auditd。ip_conntrack 界面起初看起来更好一些,但 auditd 可以免费为您提供您想要的所有信息,包括 pid 跟踪。
我认为您无法收到套接字创建的通知。您可以做的是通过读取定期检查打开的套接字/proc/net/tcp。该文件中的列之一是套接字的“inode”。
获得索引节点后,您可以通过扫描目录找到打开该套接字的进程(可以有多个)/proc/[pid]/fd。
| 归档时间: |
|
| 查看次数: |
2081 次 |
| 最近记录: |