C语言 获得有关Linux上网络接口更改的通知

ruyhziif  于 11个月前  发布在  Linux
关注(0)|答案(4)|浏览(122)

我需要一种方法来通知我的用户空间应用程序何时启用或禁用网络接口。我希望不使用轮询来实现这一点。内核是否提供某种挂钩,以便在发生网络相关事件时触发回调函数?

sf6xfgos

sf6xfgos1#

我相信netlink(man 7 netlink)工具通过NETLINK_ROUTE系列(man 7 rtnetlink)提供有关网络接口的信息。您可以在netlink套接字上使用select()poll()来获取您想要的信息。不过,我不确定这一点;我自己没有使用过它。
在更高的级别上,如果系统运行的是NetworkManager,当系统的网络状态发生变化时,它将通过D-Bus广播事件。例如,Epiphany浏览器使用这些事件在系统失去网络连接时自动激活“脱机工作”模式,并在网络连接恢复时切换回在线模式。有各种语言的D-Bus客户端库,而且它比netlink更少平台特定性,所以我推荐使用它。

js5cn81o

js5cn81o2#

选项:

  • ifplugd将在电缆插入或拔出网络接口时运行您选择的脚本。
  • 如果您使用Debian,您可以将脚本添加到/etc/network的子目录中,其中有每当接口打开或关闭时运行的脚本。
  • 如果以上两个都不适合你的需要,看看D-Bus。我从来没有成功地使用过它,但这是它设计的那种东西。
rqcrx0a6

rqcrx0a63#

在Debian版本12(Bookworm)中,以下文件夹中的文件会在接口更改时执行:/etc/NetworkManager/dispatcher.d/我在我使用的raspberry pi中添加了第二个文件02-ifupdown。该文件会传递args $1 & $2作为接口名称和状态。

ha5z0ras

ha5z0ras4#

为什么不在代码中执行fork,使用popen来执行以下操作之一:

  • 发出tail -f /var/log/messages,查找eth*接口
  • 发出ifconfig命令以查看向上或向下运行的适配器列表

并使用pregex解析数据,在一段时间内执行sleep()并再次检查..或者您可以使用'syslog.h'函数监视系统日志工具。
如果你坚持Posix标准,代码将在不同风格的Unix/Linux/BSD之间移植。

相关问题