在同一本地网络中,通过IP获取其他设备/计算机名称的iOS方法。

5

我的程序的一个任务是扫描本地Wi-Fi网络中的任何设备/计算机。我找到了获取所有工作设备IP的解决方案,但无法获取它们的名称。我没有找到解决此问题的线索。有什么建议吗?


你是如何获取所有工作设备列表的?扫描时使用的代码是什么?我尝试了许多来自互联网的代码,但都无法实现。@Nikolay Shubenkov - Alejandro Vargas
检测您的IP地址。如果您的IP地址是例如192.168.2.44,则ping所有地址从192.168.2.1到192.168.2.255的IP地址。如果您需要代码,请在StackOverflow上创建问题,发布该问题的链接,我将在github上发布项目,并在回答您的问题时放置该项目的链接。 - Nikolay Shubenkov
这是那个问题的链接。@Nikolay Shubenkov - Alejandro Vargas
@NikolayShubenkov,你成功通过 IP 地址获取计算机名了吗? - Darshan Kunjadiya
很遗憾,现在不行。这是一个相当老的问题,我无法重新检查它,因为带有代码的项目无法编译。 - Nikolay Shubenkov
有人成功获取了主机名吗? - Mehsam Saeed
2个回答

4
为了执行反向DNS查找,您需要调用CFHostGetNames函数,如下所示:
+ (NSArray *)hostnamesForIPv4Address:(NSString *)address
{
    struct addrinfo *result = NULL;
    struct addrinfo hints;

    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_NUMERICHOST;
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;

    int errorStatus = getaddrinfo([address cStringUsingEncoding:NSASCIIStringEncoding], NULL, &hints, &result);
    if (errorStatus != 0) {
        return nil;
    }

    CFDataRef addressRef = CFDataCreate(NULL, (UInt8 *)result->ai_addr, result->ai_addrlen);
    if (addressRef == nil) {
        return nil;
    }
    freeaddrinfo(result);

    CFHostRef hostRef = CFHostCreateWithAddress(kCFAllocatorDefault, addressRef);
    if (hostRef == nil) {
        return nil;
    }
    CFRelease(addressRef);

    BOOL succeeded = CFHostStartInfoResolution(hostRef, kCFHostNames, NULL);
    if (!succeeded) {
        return nil;
    }

    NSMutableArray *hostnames = [NSMutableArray array];

    CFArrayRef hostnamesRef = CFHostGetNames(hostRef, NULL);
    for (int currentIndex = 0; currentIndex < [(__bridge NSArray *)hostnamesRef count]; currentIndex++) {
        [hostnames addObject:[(__bridge NSArray *)hostnamesRef objectAtIndex:currentIndex]];
    }

    return hostnames;
}

1
我尝试了你的代码,但是我总是从那个函数中得到空值。我正在尝试在iOS应用程序中获取计算机名称。你能否建议我找到计算机名称的正确方法。谢谢。 - Darshan Kunjadiya
上述函数在尝试获取某些网络主机名时失败,并返回 null。BOOL succeeded = CFHostStartInfoResolution(hostRef, kCFHostNames, NULL); 如果未成功,则返回 nil。有什么想法为什么会这样? - Mehsam Saeed

0

BOOL succeeded = CFHostStartInfoResolution(hostRef, kCFHostNames, NULL); 现在我遇到的问题是,这一行总是失败,我尝试使用getnameinfo函数,但仍然无法获取主机名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接