我正在为Mac和Windows编写一个Go应用程序,只要网络发生变化(客户端从Wi-fi 1
移动到Wi-fi 2
或移动到3G到LAN),它就会执行一些操作。我知道在swift语言中使用mac运行的应用程序的解决方案,但我在这里寻找与平台无关的解决方案。
到目前为止,我已经尝试在界面上检查事件,但我不确定这是否足够。
我希望在网络改变(从Wifi-1转移到Wifi-2或3G或LAN)时,我的Go应用程序应该能够知道采取一些行动。
我怀疑会有这样的解决方案。
每个试图为本质上与操作系统相关的问题提供与平台无关的解决方案的项目都不可避免地隐藏了通用API背后的平台特定细节。看看https://github.com/fsnotify/fsnotify就是一个很好的例子。
所以,我会采取这种方式,并且会提出一个包,它将有两个特定于平台的“后端”,这些后端将使用构建标记进行有条件的编译。
要获得有关Windows下网络相关事件的通知,您应该启动here。不幸的是,这个东西是面向COM的,但你可以使用https://github.com/go-ole/go-ole来帮助解决这个问题。
您可能还会问一个标记为winapi
的非特定于Go的问题,询问什么是最好的方法来挂钩内核以获得有关网络可用性的通知。
没有平台无关的解决方案,但是OSx,Linux,Windows等平台有办法通过平台特定的限制来获取网络事件。
OSx:AF_ROUTE类型的原始套接字SOCK_RAW可用于检测用户计算机中发生的任何网络事件。可以检测到各种类型的网络事件。 This thread talk about an example on BSD for network event
Windows:Windows将其API作为iphlpapi库的一部分提供。像NotifyAddrChange,NotifyRouteChange这样的API允许您拥有几乎所有网络事件(除了度量标准更改等).this git repo有一个工作示例NotifyAddrChange,它可以在接口关闭或出现时返回和响应事件。
Linux:在Linux中,netlink套接字允许用户空间应用程序使用netlink套接字接收网络事件。