如何解释从SCNetworkReachabilityCreateWithName返回的null?

时间:2013-04-24 19:39:55

标签: ios reachability

我们在代码中使用此方法,使用SCNetworkReachabilityRef返回SCNetworkReachabilityCreateWithName

- (SCNetworkReachabilityRef)cCreateReachabilityRefWithCStr:(const char *)host {
    return SCNetworkReachabilityCreateWithName(NULL, host);
}

有时我们为可达性引用返回NULL。 NULL返回是什么意思?

Apple doc SCNetworkReachability Reference不讨论这些方法的NULL返回。但是Reachability sample code中的Classes / Reachability.m文件说明了SCNetworkReachabilityCreateWithName可以返回NULL但不对其进行评论的事实。

那么NULL返回意味着什么以及我该如何处理呢?

1 个答案:

答案 0 :(得分:0)

为了回应iOS开发者论坛What does a NULL return from SCNetworkReachabilityCreateWithName mean?上的类似查询(只有iOS开发者计划成员可以访问链接),Apple Developer Support的某人指出,据他所知,只有三个原因SCNetworkReachabilityCreateWithName可能返回NULL:

  1. nodename为NULL(kSCStatusInvalidArgument);
  2. 节点名为空(kSCStatusInvalidArgument);或
  3. 内存分配问题(未设置kSCStatusXxx)。
  4. 他还指出,可达性API位于Darwin中,并且Darwin实现与OS X和iOS上的实现接近。代码SCNetworkReachability.c from Darwin似乎证实了他认为上述三个原因是SCNetworkReachabilityCreateWithName返回NULL的唯一方式。

    我还了解到System Configuration Reference包含有关检测和解释通过调用SCxxx函数生成的错误的信息,特别是SCError()SCErrorString()等内容。

    我故意通过传递“”和NULL作为名称从SCNetworkReachabilityCreateWithName返回NULL,然后尝试SCErrorSCErrorString(从系统配置参考引用)并且看到我做了一些有意义的额外信息:

    reachtest1[9274:11303] isReachableWithName: entry: name: ""
    reachtest1[9274:11303] SCNetworkReachabilityCreateWithName returned NULL!
    reachtest1[9274:11303] SCError: 1002 SCErrorString: Invalid argument
    
    reachtest1[9274:11303] isReachableWithName: entry: name: (null)
    reachtest1[9274:11303] SCNetworkReachabilityCreateWithName returned NULL!
    reachtest1[9274:11303] SCError: 1002 SCErrorString: Invalid argument
    

    这解释了从Darwin代码中的三种情况中的两种返回NULL。

    还有一种方法可以使CFErrorRef使用SCCopyLastError(),其中可能实际上有更多信息。除上述系统配置参考之外,请参阅CFError Reference

    鉴于所有这些,我会说前两种情况不会重试,因为传递NULL或零长度主机名是一个程序逻辑错误。第三个与内存相关的案例可能是可重试的。