检测网络连接可用性更改

时间:2019-03-27 04:46:52

标签: go winapi networking

我正在编写适用于Mac和Windows的Go应用程序,每当网络发生变化(客户端从Wi-fi 1移至Wi-fi 2或3G移至LAN)时,该应用程序都会执行一些操作。我知道一种在Mac上以快速语言运行的应用程序的解决方案,但是我在这里寻找与平台无关的解决方案。

到目前为止,我已经尝试检查接口上的事件,但不确定是否足够。

我希望在网络发生变化(从Wifi-1更改为Wifi-2或3G或LAN)时,我的Go应用程序应该能够采取一些措施。

2 个答案:

答案 0 :(得分:1)

我怀疑是否会有这样的解决方案。

每个试图为与操作系统相关的固有问题提供与平台无关的解决方案的每个项目都不可避免地将特定于平台的细节隐藏在通用API的后面。 查看https://github.com/fsnotify/fsnotify就是一个很好的例子。

所以,我会走这条路线,并提出一个程序包,该程序包将具有两个特定于平台的“后端”,可以使用构建标记有条件地对其进行编译。

要获取有关Windows下与网络相关的事件的通知, 您可能应该开始here。 不幸的是,这些东西是面向COM的,但是您可以使用https://github.com/go-ole/go-ole来解决这个问题。

您还可能会问一个标记为winapi的非Go特定问题,以询问挂接到内核以获取有关网络可用性的通知的最佳方法是什么。

答案 1 :(得分:0)

没有平台不可知的解决方案,但是像OSx,Linux,Windiws这样的平台可以通过特定于平台的限制来获取网络事件。

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套接字接收网络事件。