Objective c 检测任何连接的网络

Objective c 检测任何连接的网络,objective-c,network-programming,foundation,Objective C,Network Programming,Foundation,如何检测是否连接了任何网络适配器?我只能找到使用nsreacapability检测internet连接的示例,但我想检测非internet网络连接。在eth0上获取IP地址应该有效吗?我只在Mac上工作。Reachability(我想你是指苹果基于底层SCNetworkReachability…API的演示类)适用于任何IP连接的主机,包括本地网络。您可以使用reachabilityForLocalWiFi方法,尽管根据该方法,当网络处于活动状态但不可路由时,它将返回YES。因此,您可能更喜欢使

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

Reachability
(我想你是指苹果基于底层
SCNetworkReachability…
API的演示类)适用于任何IP连接的主机,包括本地网络。您可以使用
reachabilityForLocalWiFi
方法,尽管根据该方法,当网络处于活动状态但不可路由时,它将返回YES。因此,您可能更喜欢使用本地地址查询
可访问性WithAddress:


是一些人推荐的
可达性的替代品。

您可以使用苹果提供的可达性代码。 以下是您可以获得“可达性”源代码的位置:

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

希望这能对你有所帮助

苹果的技术说明TN1145中提到了三种获取网络接口状态的方法:

  • 系统配置框架
  • 开放传输API
  • BSD插座
系统配置框架:这是苹果公司推荐的方式,TN1145中有示例代码。优点是它提供了一种获取接口配置更改通知的方法

开放传输API:在TN1145中也有示例代码,否则我就不能多说了。(苹果网站上只有“遗留”文档。)

BSD套接字:这似乎是获取接口列表和确定连接状态(如果不需要动态更改通知)的最简单方法

下面的代码演示如何查找“已启动并正在运行”的所有IPv4和IPv6接口

#包括
#包括
#包括
#包括
#包括
#包括
结构IFADRS*所有接口;
//获取本地计算机上所有接口的列表:
如果(GetIFAddress(&AllInterface)==0){
结构IFADRS*接口;
//对于每个接口。。。
for(接口=所有接口;接口!=NULL;接口=接口->ifa\U下一步){
无符号整数标志=接口->ifa_标志;
结构sockaddr*addr=interface->ifa\u addr;
//检查是否正在运行IPv4、IPv6接口。跳过环回接口。
if((标志和(IFF|u向上| IFF|u运行| IFF|u环回))==(IFF|u向上| IFF|u运行)){
if(addr->sau family==AF|INET | addr->sau family==AF|INET6){
//将接口地址转换为人类可读的字符串:
字符主机[NI_MAXHOST];
getnameinfo(addr,addr->sa_len,host,sizeof(host),NULL,0,NI_numericost);
printf(“接口:%s,地址:%s\n”,接口->ifa\u名称,主机);
}
}
}
freeifaddrs(所有接口);
}

您是在使用iOS、Mac还是两者都使用?好的,我只在iPhone上尝试过,所以我的答案可能在Mac上不起作用。我会看看是否可以做更多的研究。这将是非常感谢。你不应该依赖于特定的接口名称,如“eth0”。在iMac上,“en0”可以是(未连接的)以太网接口,“en1”可以是(已连接的)WiFi接口。Mac Pro可以有两个以太网接口“en0”和“en1”。您提供的可达性链接是针对iOS的。非常感谢,这是迄今为止最好的答案。我现在没有时间去尝试,但除非在接下来的6个小时内有更好的事情发生,否则我会接受它。@AndreasBergström:没关系。如果这有帮助,我很高兴。
#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);
}