我需要一种方式在启用或禁用网络接口时通知我的用户空间应用程序。我希望这样做而不诉诸于投票。当网络相关事件发生时,内核是否提供某种钩子来触发回调函数?在Linux上获取有关网络接口更改的通知
回答
我相信网络链路(man 7 netlink
)设施提供了有关通过NETLINK_ROUTE
家庭(man 7 rtnetlink
)网络接口的信息。您可以通过netlink套接字上的select()
或poll()
来获取所需的信息。虽然我不确定这一点,我自己并没有使用它。
在更高级别上,如果系统正在运行NetworkManager,则当系统的网络状态发生变化时,该系统将通过D-Bus广播事件。例如,Epiphany浏览器使用这些事件在系统失去网络连接时自动激活“脱机工作”模式,并在网络连接恢复时切换回联机模式。有多种语言的D-Bus客户端库,它比netlink的平台特定性要低,所以这是我推荐使用的。
选项:
ifplugd
将运行您所选择的剧本时,电缆插入或拔出从您的网络接口。如果您使用的是Debian,您可以将脚本添加到
/etc/network
的子目录中,其中有每次界面启动或关闭时运行的脚本。如果以上两种都不适合您的需求,请查看D-Bus。我从来没有多少成功使用它,但这是它的设计目的。
为什么不这样做的代码fork
,使用popen
采取任:
- 问题
tail -f /var/log/messages
寻找eth*
接口 - 问题
ifconfig
看到适配器列表或往上走下来
并解析数据使用pregex
,做一个sleep()
一段时间,并再次检查..或者你可以去监测e系统日志设施使用'syslog.h'功能。
如果你坚持POSIX标准,代码将横跨在Unix/Linux/BSD的不同口味的便携式...
'ifconfig'不是POSIX和输出实际上变化很多从一个UNIX到另一个。当然,它在所有Linux上都是(大部分)相同的,但即使在那里也有两种不同的常用版本(Busybox和网络工具)。 – ephemient 2010-02-14 20:22:19
没有投票或依赖于OS挂钩像诺曼·拉姆齐建议,你唯一的选择就是定期检查几秒钟前的工作界面。这只会导致事件/ rx/tx队列地狱,如果想法是在链路不可用时排队/阻塞等待聊天。
此外,Debian脚本与init脚本一起工作,它们提供的钩子不会告诉您root用户是否使用ifconfig关闭或修改已配置的接口,或者配置一个未描述为init的新配置接口。他们只会告诉你用户是否通过/etc/init.d/networking做了些什么,或者如果init做了同样的事情。
什么是非常可怜的开始一个线程轮询更改?
简言之,是的,你可以开始一个'netnicmond'进程,通知用户名单,让他们知道更改,或者更复杂的实际传达更改。你可能会使用netlink ...
你有没有考虑过使用netlink?
- 1. 如何获取网络更改通知(连接,断开,更改)
- 2. 有关iOS上的网络状态更改的通知
- 3. Wifi网络更改通知
- 4. 获取有关Android设备上WiFi状态更改的通知?
- 5. 更改linux的网络连接类型
- 6. 如何更改网络接口的网络缓冲区以获取错误?
- 7. 如何从iOS Reachability Class获取网络连接通知的更改?
- 8. (C,Linux)知道网络接口是无线还是有线
- 9. 有关互联网连接的通知在linux中不见了?
- 10. 获取有关网络AFRAME
- 11. 网络状态更改通知
- 12. 如何在Linux上以编程方式获取网络接口速度?
- 13. 获取有关Google日历中的更改的通知
- 14. 在Arch Linux中禁用网络接口
- 15. 为所有更改获取MediaWiki通知
- 16. 获取有关iPhone更改通知的地址簿
- 17. 获取有关cgroup进程更改的通知?
- 18. 如何获取有关绑定集合中更改的通知?
- 19. 使用Mailkit获取有关收件箱更改的通知
- 20. 如何获取有关数据库列更改的通知
- 21. 在Ruby上获取特定网络接口的IP地址
- 22. 重置Linux中的网络接口
- 23. 获取网络接口信息
- 24. 获取网络接口信息C++
- 25. 在Linux下更改网络接口的名称,但忽略文件70-persistent-net.rules
- 26. 如何告诉Qt网络更改输出网络接口?
- 27. 是否有针对WiFi网络更改的NSNotificationCenter通知?
- 28. 如何在iOS上获取网络接口信息(例如'en0')?
- 29. 获取Firebase网络通知即使关闭Chrome
- 30. 修改通过接口发送的所有网络数据包
关于'rtnetlink',你可能想要检查这个链接的示例代码:http://stackoverflow.com/a/2353441/1435026 – fanyangxi 2012-07-15 03:41:02