检测任何连接的网络

时间:2012-10-02 12:51:37

标签: objective-c network-programming foundation

如何检测是否连接了任何网络适配器?我只能找到使用NSReachability来检测互联网连接的例子,但我想检测一个非互联网网络连接。获取eth0的IP地址应该有效吗?我只在Mac上工作。

3 个答案:

答案 0 :(得分:8)

Apple的技术说明TN1145 中的

Getting a List of All IP Addresses提到了获取网络接口状态的3种方法:

  • 系统配置框架
  • Open Transport API
  • BSD套接字

系统配置框架:这是Apple推荐的方式,TN1145中有示例代码。优点是它提供了一种获得接口配置变化通知的方法。

打开传输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);
}

答案 1 :(得分:1)

您可以使用Apple提供的Reachability代码。 这是link,您可以在其中获得“可达性”源代码:

您也可以下载此文件:Github中的TestWifi。它将向您展示如何实现Reachability类。

希望这可以帮到你。


答案 2 :(得分:0)

Reachability(我认为你的意思是基于底层SCNetworkReachability... API的Apple的演示类)适用于任何IP连接的主机,包括在本地网络上。您可以使用reachabilityForLocalWiFi方法,但根据this page,当网络处于活动状态但不可路由时,它将返回YES。因此,您可能更愿意使用本地地址查询reachabilityWithAddress:

This是某些人推荐的Reachability的替代品。