【问题标题】:How to get ip address from NetService如何从 NetService 获取 IP 地址
【发布时间】:2012-09-24 02:54:50
【问题描述】:

当我得到一个 NetService 对象时,我尝试这样做:

NSNetService *ss=[netArray objectAtIndex:indexPath.row];
ss.delegate=self;
[ss resolveWithTimeout:3.0];

关于委托方法:

-(void)netServiceDidResolveAddress:(NSNetService *)sender
{
   NSArray *address=sender.addresses;
   NSData *addressData=[NSData dataWithBytes:address length:sizeof(address)];
   /*
   How?
   */
}

谢谢。

【问题讨论】:

  • 请注意NSNetService#address 方法返回多个对象:An array containing NSData objects, each of which contains a socket address for the service. (source)。因此,您应该迭代数组。

标签: iphone xcode ip-address data-conversion nsnetservice


【解决方案1】:
// Sent when addresses are resolved
- (void)netServiceDidResolveAddress:(NSNetService *)netService
{
    // Make sure [netService addresses] contains the
    // necessary connection information
    if ([self addressesComplete:[netService addresses]
                 forServiceType:[netService type]]) {
        [services addObject:netService];
    }
}

// Verifies [netService addresses]
- (BOOL)addressesComplete:(NSArray *)addresses
           forServiceType:(NSString *)serviceType
{

    // Perform appropriate logic to ensure that [netService addresses]
    // contains the appropriate information to connect to the service

    NSData *myData = nil;
    myData = [addresses objectAtIndex:0];

    NSString *addressString;
    int port=0;
    struct sockaddr *addressGeneric;
    struct sockaddr_in addressClient;


    addressGeneric = (struct sockaddr *) [myData bytes];

    switch( addressGeneric->sa_family ) {
        case AF_INET: {
            struct sockaddr_in *ip4;
            char dest[INET_ADDRSTRLEN];
            ip4 = (struct sockaddr_in *) [myData bytes];
            port = ntohs(ip4->sin_port);
            addressString = [NSString stringWithFormat: @"IP4: %s Port: %d", inet_ntop(AF_INET, &ip4->sin_addr, dest, sizeof dest),port];
        }
            break;

        case AF_INET6: {
            struct sockaddr_in6 *ip6;
            char dest[INET6_ADDRSTRLEN];
            ip6 = (struct sockaddr_in6 *) [myData bytes];
            port = ntohs(ip6->sin6_port);
            addressString = [NSString stringWithFormat: @"IP6: %s Port: %d",  inet_ntop(AF_INET6, &ip6->sin6_addr, dest, sizeof dest),port];
        }
            break;
        default:
            addressString=@"Unknown family";
            break;
    }

    NSLog(@"Client Address: %@",addressString);


    return YES;
}

这是输出 客户端地址:IP4:192.168.69.38 端口:58612

【讨论】:

  • 为什么这里的 serviceType 没有被使用?
【解决方案2】:

我找到了a post,它提出了以下解决方案。

NSString* addressString = [[NSString alloc] initWithData:addressData encoding:NSASCIIStringEncoding];

虽然它确实为我输出人类可读的字符串......它可能对你有用。


这是我打印 NSData 对象时写入控制台的内容。

<10026a5e 0a0a7893 00000000 00000000>

同时,我发现第二段是IP地址的十六进制形式。在这个例子中是...

10.10.120.147 // 0a0a7893

我写了一个Host class 来进行转换。 NSString 扩展名可以在 here 中找到。我只使用前 16 字节地址,而忽略所有其他地址。随意扩展课程。

【讨论】:

  • 所以请与其他人分享您的解决方案。这就是这个平台的工作原理。
  • @Vic 如果您没有发布自己的解决方案,您可以mark mine ...
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多