如何在OS X上确定是否存在活动的网络连接?

4

当网络请求失败时,我希望为我的用户提供一些有意义的错误信息。

在Windows上,我可以调用InternetGetConnectedState()来查看是否存在活动网络连接。那么在OS X上有什么等效的方法呢?

如果示例代码比较复杂,则可以获得额外的奖励分数。

4个回答

3
不要寻找活动的网络连接,而是寻找您的目标主机可以访问。这并不复杂,因此没有示例代码 :-)
更新:我认为我应该解释一下在这种情况下“可访问”是什么意思。如文档所述,如果一个数据包可以通过任何网络接口离开计算机并到达远程网络地址,则认为该远程网络地址是可访问的。粗略地说,这表明接口已配置并能够直接传递到远程系统,或者具有可用于到达远程系统的路由。可达性与远程主机是否处于“上线”状态或此计算机与远程计算机之间的网络是否正常运行无关。

我希望能够区分无网络和主机不可达。 - i_am_jorf
1
如果您还没有阅读过scutil手册页,建议您先阅读一下。您可以通过它或较低级别的API检查许多内容。 - Ned Deily
为什么?两者都意味着“无法连接到主机”,这是用户需要完成工作的必要步骤。 - user23743
一个是“连接你的网络电缆,否则我无法工作”,另一个是“咦,那个网站好像挂了。”它们对我来说看起来非常不同。但我想现在只能暂时满足于可达性了。 - i_am_jorf
啊,我觉得你误解了文档 :-(。可达性是告诉你如果一个数据包要发往这个主机是否可以离开本地,也就是说,是否有路由可达。它并不检查远程是否已经启动。 - user23743

1
如果你运行ifconfig命令行工具,你会得到以下输出:
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether 00:0d:93:48:d8:f2 
        media: autoselect (none) status: inactive
        supported media: none autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP <full-duplex,hw-loopback> 100baseTX <half-duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback> 1000baseT <full-duplex> 1000baseT <full-duplex,hw-loopback> 1000baseT <full-duplex,flow-control> 1000baseT <full-duplex,flow-control,hw-loopback>
en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet6 fe80::211:24ff:fe27:385f%en1 prefixlen 64 scopeid 0x5 
        inet 192.168.1.67 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:11:24:27:38:5f 
        media: autoselect status: active
        supported media: autoselect

在我的情况下,请注意我的en0未连接,而我的en1已连接。相应地,有“状态:活动”或“状态:不活动”。您可以运行ifconfig,解析输出,并查看是否有任何活动接口。除了回环之外。
可能有更多的API方式来做到这一点,但我不能告诉你它们是什么!

1
是的,我会坚持等待API解决方案。这在不同操作系统和版本之间可能会出现问题。 - i_am_jorf

1

OSX积极支持网络/连接情况的变化,并在发生更改时重新配置。因此,它期望应用程序开发人员不要假设网络将始终保持不变。您可能会发现System Configuration Goals and Architecture很有趣,同时也可以了解configd的工作原理。(这只是从阅读中了解到的,我从未在Mac上编写过此类程序)


没错,我不想缓存这个值,我只是想在检查时获取当前是否连接了某些东西。 - i_am_jorf

1

SystemConfiguration框架还可以通过一个简单的命令行工具scutil(8)来访问:

$ scutil -r stackoverflow.com
Reachable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接