如何在 iPhone 中检查 *** 连接

Posted

技术标签:

【中文标题】如何在 iPhone 中检查 *** 连接【英文标题】:How to check *** Connectivity in iPhone 【发布时间】:2011-12-29 05:30:24 【问题描述】:

我对这个发展很陌生。 我在互联网上搜索了很多,但找不到任何合适的解决方案。 我想检查我的 iPhone 应用程序中可用的 *** 连接,因为我正在从通过 *** 连接的客户端机器获取数据。 我确实检查了 Internet 连接是否可用,但无法检查 *** 是否已连接。 请就此向我提出建议。

【问题讨论】:

【参考方案1】:

Ping 或查找仅应在 *** 上可用的地址,如果您可以连接,则 *** 正在使用中。

【讨论】:

感谢您的回复。您能否提供一些代码或逻辑来查找用户无需花费太多时间等待的地址。谢谢..【参考方案2】:

如果你想 ping 功能,你可以这样做;

    为您的内部 IP 设置一个套接字 使套接字不阻塞 使用 select 检查套接字状态

它对我有用

【讨论】:

感谢您的回复。你能提供我可以实现的任何小代码或库参考吗?【参考方案3】:

我刚刚找到了另一种检查 *** 连接的方法,但在任何地方都没有提到。 您可以使用 getifaddrs() 来获取当前的网络接口。 然后遍历它们并检查它们的名称。如果其中任何一个包含 taptunppp,则用户已连接 ***。

  - (BOOL)is***Connected

    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;

    // retrieve the current interfaces - returns 0 on success
    success = getifaddrs(&interfaces);
    if (success == 0) 
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while (temp_addr != NULL) 
            NSString *string = [NSString stringWithFormat:@"%s" , temp_addr->ifa_name];
            if ([string rangeOfString:@"tap"].location != NSNotFound ||
                [string rangeOfString:@"tun"].location != NSNotFound ||
                [string rangeOfString:@"ppp"].location != NSNotFound)
                return YES;
            

            temp_addr = temp_addr->ifa_next;
        
    

    // Free memory
    freeifaddrs(interfaces);
    return NO;

UPD:在 ios 9 上,上面的代码不起作用。无论***是否连接,接口都是相同的。在这种情况下尝试以下代码:

 - (BOOL)is***Connected

    NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings());
        NSArray *keys = [dict[@"__SCOPED__"]allKeys];
        for (NSString *key in keys) 
            if ([key rangeOfString:@"tap"].location != NSNotFound ||
                [key rangeOfString:@"tun"].location != NSNotFound ||
                [key rangeOfString:@"ppp"].location != NSNotFound)
                return YES;
            
        
        return NO;

【讨论】:

你能告诉我我必须为此导入任何框架吗?我的意思是#import? @harshalb 我没有,没有。但是你可以试试#include @TimurSuleimanov 您的两个代码 sn-ps 都不再起作用(我使用的是 iOS 10)。知道如何解决这个问题吗? 所有基于 SCOPED 的解决方案都不能可靠地与 IPSec *** 配合使用,即使您将“ipsec”添加到密钥检测逻辑中也是如此。【参考方案4】:

要修复在 iOS 11 上测试的 Timur Suleimanov 答案,您需要寻找 IPSec 接口;

- (BOOL)is***Connected 
    NSDictionary *dict = CFBridgingRelease(CFNetworkCopySystemProxySettings());
    NSArray *keys = [dict[@"__SCOPED__"]allKeys];
    for (NSString *key in keys) 
        if ([key rangeOfString:@"tap"].location != NSNotFound ||
            [key rangeOfString:@"tun"].location != NSNotFound ||
            [key rangeOfString:@"ipsec"].location != NSNotFound ||
            [key rangeOfString:@"ppp"].location != NSNotFound)
            return YES;;
        
    
    return NO;

【讨论】:

【参考方案5】:

这里是 Swift 版本的代码

var is***Connectd : Bool 
    get 
        if let dict = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as? Dictionary<String, AnyObject>,
            let keys = (dict["__SCOPED__"] as? [String : AnyObject])?.keys 
            for key in keys 
                if key.range(of: "tap") != nil ||
                    key.range(of: "tun") != nil ||
                    key.range(of: "ipsec") != nil ||
                    key.range(of: "ppp") != nil 
                    return true
                
            
            return false
        
        else 
            return false
        



    

【讨论】:

以上是关于如何在 iPhone 中检查 *** 连接的主要内容,如果未能解决你的问题,请参考以下文章

(iOS) 如何检查 iPhone 的配对蓝牙设备?

如何以编程方式检查视频或音频文件格式是不是可以在 iPhone 中播放?

如何检查任何值是不是已隐藏在 iphone 应用程序中

如何获取IP地址打开球形相机设备并检查是不是连接?

如何在 xib 的 appdelegate 中检查设备是 ipad 还是 iphone?

如何检查我的 iPhone 应用程序在 iTunes 备份中占用了多少空间?