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

时间:2009-09-07 21:07:17

标签: macos networking

我想在网络请求失败时向我的用户提供一些有意义的错误消息。

在Windows上,我可以调用InternetGetConnectedState()查看是否存在活动的网络连接。什么是OS X等价物?

如果代码很复杂,可以使用示例代码。

4 个答案:

答案 0 :(得分:3)

不要寻找有效的网络连接,查找目标主机为reachable。它并不复杂,所以没有示例代码: - )

更新:我想我应该已经解释了在这种情况下可达到的意义。如文档中所述,如果发往该地址的数据包可以通过任何网络接口离开此计算机,则认为远程网络地址是可达的。粗略地说,这表示i / f已配置并能够直接传送到远程系统,或者具有可用于到达它的路由。可达性不描述与远程主机是否“启动”有关的任何内容,或者此计算机与远程主机之间的网络是否正常运行。

答案 1 :(得分:1)

OSX主动支持网络/连接情况的更改,并在发生更改时重新配置。因此,它希望应用程序开发人员不要假设网络将始终保持不变。您可能会发现System Configuration Goals and Architecture一个有趣的读物,以及检查configd的工作方式。 (这只是从阅读它,我从来没有在mac上编程这样的东西)

答案 2 :(得分:1)

SystemConfiguration框架也通过简单的命令行实用程序scutil(8)公开:

$ scutil -r stackoverflow.com
Reachable

答案 3 :(得分: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是。相应地,有'status:active'或'status:inactive'。您可以运行ifconfig,解析输出,并查看是否有任何活动接口。除了环回。

可能有更多的API方法可以做到这一点,但我无法告诉你它们是什么!