【问题标题】:Testing connectivity / availability of IP Address in Objective C在 Objective C 中测试 IP 地址的连接性/可用性
【发布时间】:2016-04-21 21:17:48
【问题描述】:

基本上我希望能够检查我本地网络上的特定主机是否“启动”。

当主机无法访问时,下面这行代码会挂起,所以我想在运行之前先进行检查。

    [_outputStream write:[data bytes] maxLength:[data length]];

我认为在以下链接中回答了类似的查询,但我认为我需要使用CFHostCreateWithAddress 而不是CFHostCreateWithName

Alternatives to NSHost in iPhone app

这是我正在尝试做的事情......

Boolean result;
struct sockaddr_in address;

address.sin_family = AF_INET;
address.sin_port = htons(80);
inet_pton(AF_INET, "192.168.1.31", &address.sin_addr);

CFDataRef sockData = CFDataCreate(NULL, &address, sizeof(address));
CFHostRef host = CFHostCreateWithAddress(NULL, sockData);
result = CFHostStartInfoResolution(host, kCFHostAddresses, NULL);

if (result == TRUE) {
    NSLog(@"Resolved");
} else {
    NSLog(@"Not resolved");
}

即使主机启动,我也得到 Not resolve。

下面是我尝试使用 Reachability 类。我的代码告诉我,尽管指定地址没有主机,但可以访问以下地址。

struct sockaddr_in address;

address.sin_family = AF_INET;
address.sin_port = htons(80);
inet_pton(AF_INET, "192.168.1.31", &address.sin_addr);

Reachability *reachability = [Reachability reachabilityWithAddress:&address];
NetworkStatus reachabilitytoHost = [reachability currentReachabilityStatus];
if(reachabilitytoHost != NotReachable)
{
    NSLog(@"Reachable");
}
else
{
    NSLog(@"Not Reachable");
}

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    将可达性类添加到您的项目中。

     #import "Reachability.h"
    

    同时添加SystemConfiguration 框架。

    Reachability *reachability = [Reachability reachabilityWithHostName:@"www.example.com"];
    NetworkStatus reachabilitytoHost = [reachability currentReachabilityStatus];
    if(reachabilitytoHost != NotReachable)
    {
        //reachable
    }
    else
    {
        // not reachable
    }
    

    在此处查看示例代码:https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html

    欲了解更多信息:https://developer.apple.com/library/ios/samplecode/Reachability/Listings/Reachability_Reachability_h.html

    【讨论】:

    • 我尝试使用 Reachability 类,直到我意识到,据我所知,它并不是我要寻找的......“注意:如果您可以连接到特定主机,Reachability 无法告诉您的应用程序,只有一个接口可用,它可能允许连接”所以基本上,可达性不会告诉我在指定地址是否有主机,只是告诉我有一个潜在的路由到该主机(如果存在)。我很确定我在尝试时发现了这种情况。可达性告诉我主机是可达的,即使在指定的地址没有机器。
    【解决方案2】:

    看看 Tony Million 的 Reachability 课程:https://github.com/tonymillion/Reachability

    来自自述文件:

        // Allocate a reachability object
    Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];
    
    // Set the blocks
    reach.reachableBlock = ^(Reachability*reach)
    {
        // keep in mind this is called on a background thread
        // and if you are updating the UI it needs to happen
        // on the main thread, like this:
    
        dispatch_async(dispatch_get_main_queue(), ^{
          NSLog(@"REACHABLE!");
        });
    };
    
    reach.unreachableBlock = ^(Reachability*reach)
    {
        NSLog(@"UNREACHABLE!");
    };
    
    // Start the notifier, which will cause the reachability object to retain itself!
    [reach startNotifier];
    

    您显然可以将 www.google.com 替换为您想测试的任何地址。

    【讨论】:

    • 我尝试使用 Reachability 类,直到我意识到,据我所知,它并不是我要寻找的......“注意:如果您可以连接到特定主机,Reachability 无法告诉您的应用程序,只有一个接口可用,它可能允许连接”所以基本上,可达性不会告诉我在指定地址是否有主机,只是告诉我有一个潜在的路由到该主机(如果存在)。我很确定我在尝试时发现了这种情况。可达性告诉我主机是可达的,即使在指定的地址没有机器。
    • 嗯,好的,在这种情况下,您是否尝试过简单地使用 WKWebView 类并尝试打开您要查找的 URL?使用委托来查看它是否给你一个错误响应。
    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多