1

我正在尝试在 iOS 上的本地 wifi 网络上查找 Windows 计算机的 IP(名为 TEST)以用于 smb 目的。我在这台 Windows 机器上安装了 bonjour,如果我在我的 mac(在同一个 wifi 网络上)的终端中键入以下命令:

ping TEST.local

我成功了('64 bytes from 10.0.1.19: icmp_seq=285 ttl=128 time=3.237 ms')。注意 ip (10.0.1.19):它正确解析了主机名!目前没有问题!

现在,我正在尝试使用 CFHostCreateWithName 在 iOS 上做同样的事情:

NSString *host = @"TEST.local";
CFHostRef hostref = CFHostCreateWithName(nil/*or kCFAllocatorDefault, same result...*/,(__bridge CFStringRef)host);

CFStreamError *err;
Boolean lookup = CFHostStartInfoResolution(hostref, kCFHostAddresses, err);
NSArray* addresses = (__bridge NSArray*)CFHostGetAddressing(hostref, &lookup);


id first = addresses.firstObject;

if(first!=nil) {

    struct in_addr *firstaddress = (__bridge struct in_addr *)first;
    NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(*(firstaddress))];
}

结果各不相同:

  • 首先它返回 2 个地址,它们都相同,而且是无意义的(不在 10.0.1.19 附近,通常以 8 开头)
  • 之后,没有结果,并且出现错误(err):err->domain = 12 和 err->error = 8。看起来像是某种形式的缓存,不确定...

所以主机解析在mac上很好,但在连接到同一网络的iOS设备上不起作用......我错过了什么吗?

4

1 回答 1

1

基本上,您可以使用以下方法获取主机名:

NSString* hostname = @"Mac-mini.local";

CFHostRef hostRef = CFHostCreateWithName(kCFAllocatorDefault, (__bridge CFStringRef)hostname);
Boolean lookup = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL);

if (lookup) {
    CFArrayRef addresses = CFHostGetAddressing(hostRef, &lookup);

    struct sockaddr_in *remoteAddr;

    for(int i = 0; i < CFArrayGetCount(addresses); i++) {
        CFDataRef saData = (CFDataRef)CFArrayGetValueAtIndex(addresses, i);
        remoteAddr = (struct sockaddr_in*)CFDataGetBytePtr(saData);
        if(remoteAddr != NULL){
            NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(remoteAddr->sin_addr)];
            NSLog(@"dns:%@",strDNS);
        }
    }

    CFRelease(addresses);
}

在您的情况下,您必须以这种方式对其进行修改:

NSString *host = @"TEST.local";
CFHostRef hostref = CFHostCreateWithName(kCFAllocatorDefault,(__bridge CFStringRef)host);

CFStreamError *err;
Boolean lookup = CFHostStartInfoResolution(hostref, kCFHostAddresses, err);
NSArray* addresses = (__bridge NSArray*)CFHostGetAddressing(hostref, &lookup);

if(addresses.firstObject!=nil) {
    struct sockaddr_in *firstaddress = (struct sockaddr_in*)CFDataGetBytePtr((__bridge CFDataRef)addresses.firstObject);
    NSString *strDNS = [NSString stringWithUTF8String:inet_ntoa(firstaddress->sin_addr)];
}
于 2015-10-22T11:07:19.397 回答