繁体   English   中英

在iOS上查找Windows本地主机名的IP地址

[英]Finding IP address of windows local hostname on iOS

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

ping TEST.local

我获得了成功('从10.0.1.19开始的64个字节: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设备上不起作用...我错过了什么吗?

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

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)];
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM