无法检查特定 IP 地址的可达性。是不是有任何 MAC 框架支持此功能

Posted

技术标签:

【中文标题】无法检查特定 IP 地址的可达性。是不是有任何 MAC 框架支持此功能【英文标题】:Unable to check reachability of particular ip address. Do any of MAC frameworks support this无法检查特定 IP 地址的可达性。是否有任何 MAC 框架支持此功能 【发布时间】:2016-07-25 09:41:10 【问题描述】:

我遵循的步骤 1)添加系统配置框架并导入#import“systemconfiguration/scnetworkreachability.h”,然后添加以下代码用于检查连接

BOOL hasLeadingNumberInString(NSString* s) 
  if(s)
      return [s length] && isnumber([s characterAtIndex:0]);
else
    return NO;


-(BOOL)networkConnected: (NSString *)ipAdress  
    SCNetworkReachabilityFlags  flags = 0;
    SCNetworkReachabilityRef    netReachability;
    BOOL                        retrievedFlags = NO;

    // added the "if" and first part of if statement
    //
    if (hasLeadingNumberInString(ipAdress)) 
        struct sockaddr_in the_addr;
        memset((void *)&the_addr, 0, sizeof(the_addr));
        the_addr.sin_family = AF_INET;
        the_addr.sin_len = sizeof(the_addr);
        const char* server_addr = [ipAdress UTF8String];
        unsigned long ip_addr = inet_addr(server_addr);
        the_addr.sin_addr.s_addr = ip_addr;
        netReachability =    SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr*)&the_addr);
     else 
        netReachability = SCNetworkReachabilityCreateWithName(NULL, [ipAdress UTF8String]);
    
    if (netReachability) 
        retrievedFlags = SCNetworkReachabilityGetFlags(netReachability, &flags);
        CFRelease(netReachability);
    
    if (!retrievedFlags || !flags) 
        return NO;
    
    return YES;


- (void)checkconnectivity

    if([self networkConnected:@"192.168.2.10" ])
        NSLog(@"Connected");
    else
         NSLog(@"Not Connected");


看在上帝的份上,它总是返回连接。

我遵循的方法2, 我使用 cocopods 添加了 AFnetworking。我导入了“AFNetworkReachabilityManager.h”文件并使用 managerforaddress,它总是返回未知

 AFNetworkReachabilityManager *addressCheck=[AFNetworkReachabilityManager managerForAddress:@"192.168.3.10"];
   [addressCheck startMonitoring];
    [addressCheck setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) 
        NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
    ];

    NSLog(@"%hhd",addressCheck.reachable);
    NSLog(@"%hhd",[addressCheck isReachable]);

    NSString *str=[[NSString alloc]initWithString:[addressCheck localizedNetworkReachabilityStatusString]];
    NSLog(@"%@",str);

    NSLog(@"%@",addressCheck.localizedNetworkReachabilityStatusString);


即使以这种方式,我也无法获得特定地址的连接。有没有办法得到这个或者它是不可能的。

【问题讨论】:

在方法 1 中,!flags 应该是 !(flags & kSCNetworkReachabilityFlagsReachable),确定吗? 即使更改了上述修改后,也没有结果。谢谢 【参考方案1】:

您可以简单地使用Processping 命令来检查IP 地址是否可达。

Swift 4 示例:(仅限 macOS

func ping(at ipAddress: String) -> Int32 
    let process = Process.launchedProcess(launchPath: "/sbin/ping", arguments: ["-c1", ipAddress])
    process.waitUntilExit()
    return process.terminationStatus


let reachable = ping(at: "10.0.1.119") == 0

【讨论】:

以上是关于无法检查特定 IP 地址的可达性。是不是有任何 MAC 框架支持此功能的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 IP 地址是不是来自 Java 中的特定网络/网络掩码?

在 Powershell 中检查范围

需要帮忙。 Apple 的带有地址的可达性类不起作用

检查字符串是不是与python中的IP地址模式匹配?

针对 URL 中的特定页面检查可访问性

openwrt进不去192.168.2.1