微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每次在我的Linux机器上创build一个新套接字时如何运行代码?

每次在我的Linux服务器上创build一个新的TCP套接字时,我需要调用一个函数。 架构代码是:

do { new_socket = block_until_new_socket_created(); do_something(new_socket); } while (true);

问题是,在执行代码的UNIX / Linux服务器上创build新的tcp套接字时,有没有任何库/工具/函数需要通知

编程代码是C.

peekmessage(创build窗口循环)

getrusage返回舍入的数字

编写用于C#的非托pipeC ++ DLL

当Windows UAC设置为始终通知时,无法在registry中写入

为什么插入字符到一个可执行的二进制文件导致它“打破”?

音量(平衡)控制XP / Vista的

父母和孩子在分叉之后是否共享相同的文件偏移量?

为什么我需要直接在PC上编译ffmpeg,在这个PC上我将开发使用ffmpeg库的应用程序?

推荐用于windows的Git工具

保持sdl2和sdl1.2在同一个操作系统?

老问题,但至少有两种方法可以做到这一点:

1)使用审计子系统

您可以配置auditd和Linux审计子系统,以在每次系统调用发生时记录消息。 它将包括时间戳和调用过程。 钩子“连接()”和/或“bind()”的东西应该为您提供所需的套接字。 这是auditd设计的目的。

2)使用ip_conntrack(netfilter / ip_tables)

使用类似libnetfilter-conntrack库(使用ip_conntrack内核模块)会根据需要通知所有新插槽。 但是,它只会告诉你本地和远程地址/端口和时间戳,而不是inode。 这意味着将其关联到一个pid,你必须先读取来自conntrack的通知,然后解析/ proc / net / {tcp / udp / whatever}文件中的文件来查找socket和inode,然后解析所有/ proc / $ pid / fd / *文件找出哪个pid拥有该inode。 在每个步骤中,您都必须希望在您通过三个步骤读取文件套接字没有消失。 这个系统被netsniff-ng utils软件包的flowtop使用。

所有的系统都需要root权限,尽管一旦auditd配置为root权限,日志可以被非root用户读取。 我想你会尽可能使用auditd。 ip_conntrack接口起初看起来好一些,但是auditd可以免费获得所有你想要的信息,包括pid跟踪。

我不认为你可以得到一个套接字创建的通知。 你可以做的是定期检查/proc/net/tcp打开的套接字。 该文件中的一列是套接字的“inode”。

一旦你有了inode,你可以通过扫描/proc/[pid]/fd目录找到那些打开这个套接字的进程 (可以有几个)。

那么你应该可以使用nmap来查看你的linux机器上可用的开放套接字。 例如,如果您碰巧创建服务器并将其绑定到端口号(例如9999),则nmap将显示端口处于打开状态。

我不认为获得PID是一个套接字服务器是可能的…但是,你可以使用'顶部'命令使用该套接字的程序的PID。

如果感兴趣的套接字由inetd管理,那么您可以修改它以在接受新连接时触发事件。

但是,如果您还想要套接字以及绕过inetd的套接字,则需要使用其他答案中提出的方法

我不知道在“普通程序”中这是否可行,但是你可以编写一个自己的内核模块来“钩住”如果一个套接字被创建时调用的相关系统调用(我认为它是sys_socket ,但是我不确定对这个)。 但正如@Zoska所指出的那样,您需要加载内核模块的权限。

“挂钩”意味着(基本上)将原来的调用重定向到您自己的自定义函数,而后者又可以调用原始的系统调用并在之前和之后执行操作,以便您的函数能够通知您的程序。 这里是关于系统调用挂钩的一些信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐