如何检测是否连接了任何网络适配器?我只能找到使用 NSReachability 检测互联网连接的示例,但我什至想检测非互联网网络连接。在 eth0 上获取 IP 地址应该可以吗?我只在 Mac 上工作。
问问题
5177 次
3 回答
8
在 Apple 的技术说明 TN1145中获取所有 IP 地址的列表提到了 3 种获取网络接口状态的方法:
- 系统配置框架
- 开放传输 API
- BSD 套接字
系统配置框架:这是Apple推荐的方式,TN1145中有示例代码。优点是它提供了一种获取接口配置更改通知的方法。
Open Transport API: TN1145中也有示例代码,否则我就不多说了。(Apple 网站上只有“遗留”文档。)
BSD 套接字:这似乎是获取接口列表和确定连接状态的最简单方法(如果您不需要动态更改通知)。
以下代码演示了如何查找所有“启动并运行”的 IPv4 和 IPv6 接口。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <net/if.h>
#include <netdb.h>
struct ifaddrs *allInterfaces;
// Get list of all interfaces on the local machine:
if (getifaddrs(&allInterfaces) == 0) {
struct ifaddrs *interface;
// For each interface ...
for (interface = allInterfaces; interface != NULL; interface = interface->ifa_next) {
unsigned int flags = interface->ifa_flags;
struct sockaddr *addr = interface->ifa_addr;
// Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) {
if (addr->sa_family == AF_INET || addr->sa_family == AF_INET6) {
// Convert interface address to a human readable string:
char host[NI_MAXHOST];
getnameinfo(addr, addr->sa_len, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
printf("interface:%s, address:%s\n", interface->ifa_name, host);
}
}
}
freeifaddrs(allInterfaces);
}
于 2012-10-14T16:05:00.883 回答
1
您可以使用苹果提供的可达性代码。这是您可以获得“可达性”源代码的链接:
你也可以下载这个文件:Github 中的 TestWifi。它将向您展示如何实现 Reachability 类。
希望这可以帮助你。
于 2012-10-11T06:03:41.137 回答