【问题标题】:reachability test for specific ip/port特定 ip/port 的可达性测试
【发布时间】:2013-07-03 17:57:12
【问题描述】:

我正在尝试检查地址和端口是否可用。为此,我遵循这篇文章(iphone) reachability test for specific ip/port? 和我的代码中的不同步骤:

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

-(BOOL)networkConnected: (NSString *)ipAdress Port:(int)port {
    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_port = htons(port);
        const char* server_addr = [ipAdress UTF8String];
        unsigned long ip_addr = inet_addr(server_addr);
        the_addr.sin_addr.s_addr = ip_addr;
        netReachability =    SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (struct sockaddr*)&the_addr);
    } else {
        netReachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [ipAdress UTF8String]);
    }
    if (netReachability) {
        retrievedFlags = SCNetworkReachabilityGetFlags(netReachability, &flags);
        CFRelease(netReachability);
    }
    if (!retrievedFlags || !flags) {
        return NO;
    }
    return YES;
}

但即使存在几个地址/端口,我也总是没有。我做错了什么??

编辑日志:

netReachability is NIL

【问题讨论】:

  • 您链接到的问题的答案明确指出 SCNetworkReachability 不能用于检查特定主机/端口的可用性。
  • ipAdress 字符串的内容是什么?
  • 是的,内容是字符串
  • 是的,但是什么字符串?给我们看看!
  • [self networkConnected:@"192.168.1.45" Port:1785] ipAdress 等于@"192.168.1.45"

标签: ios objective-c sockets reachability


【解决方案1】:

the_addr.sin_len = sizeof(the_addr);

您忘记设置结构的这一部分。没有它,它将被解释为零长度(无效)。如果您设置它,您的SCNetworkReachabilityRef 将不再是NULL

【讨论】:

  • 写我的时候没有看到你的答案!
  • @MartinR 你的还有一些额外的信息^^
【解决方案2】:

SCNetworkReachabilityCreateWithAddress() 失败,因为您忘记设置

the_addr.sin_len = sizeof(the_addr);

如果你添加它应该可以工作。

但请注意,SCNetworkReachability 函数仅检查数据包是否可以路由 到目的地。它不验证主机是否真的在给定端口监听。

因此,端口号无关紧要,您可以使用

netReachability  = SCNetworkReachabilityCreateWithName(NULL, server_addr);

没有所有struct sockaddr_in 的麻烦。

【讨论】:

  • 其实整个服务器真的是无关紧要的。您可以使用任何您想要的 IP 地址(甚至是无效的 IP 地址),只要您连接到 Internet,就可以满足可达性。
  • 因为这个方法没有给出预期的结果,你建议我或建议我测试一下端口和地址是否可用?
  • @iPisix:它真正连接到该主机/端口的唯一方法。您可以使用“低级”connect() 或更高级别的框架,请参阅developer.apple.com/library/mac/#documentation/Networking/…
  • 我找到了“SOCKET”的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多