iPhone: Bonjour NSNetService IP address and port

前端 未结 3 1488
礼貌的吻别
礼貌的吻别 2021-01-31 05:47

Excuse my iPhone/Objective-C newbie status please!

I\'ve found my HTTP server using NSNetServiceBrowser, but now I just want the IP address and port of the service found

3条回答
  •  Happy的楠姐
    2021-01-31 06:04

    Remix of the accepted answer in a category:

    NSNetService+Util.h

    #import 
    
    @interface NSNetService (Util)
    
    - (NSArray*) addressesAndPorts;
    
    @end
    
    
    @interface AddressAndPort : NSObject 
    
    @property (nonatomic, assign) int port;
    @property (nonatomic, strong)  NSString *address;
    
    @end
    

    NSNetService+Util.m

    #import "NSNetService+Util.h"
    #include 
    
    @implementation NSNetService (Util)
    
    - (NSArray*) addressesAndPorts {
    
        // this came from http://stackoverflow.com/a/4976808/8047
        NSMutableArray *retVal = [NSMutableArray array];
        char addressBuffer[INET6_ADDRSTRLEN];
    
        for (NSData *data in self.addresses)
        {
            memset(addressBuffer, 0, INET6_ADDRSTRLEN);
    
            typedef union {
                struct sockaddr sa;
                struct sockaddr_in ipv4;
                struct sockaddr_in6 ipv6;
            } ip_socket_address;
    
            ip_socket_address *socketAddress = (ip_socket_address *)[data bytes];
    
            if (socketAddress && (socketAddress->sa.sa_family == AF_INET || socketAddress->sa.sa_family == AF_INET6))
            {
                const char *addressStr = inet_ntop(
                                                   socketAddress->sa.sa_family,
                                                   (socketAddress->sa.sa_family == AF_INET ? (void *)&(socketAddress->ipv4.sin_addr) : (void *)&(socketAddress->ipv6.sin6_addr)),
                                                   addressBuffer,
                                                   sizeof(addressBuffer));
    
                int port = ntohs(socketAddress->sa.sa_family == AF_INET ? socketAddress->ipv4.sin_port : socketAddress->ipv6.sin6_port);
    
                if (addressStr && port)
                {
                    AddressAndPort *aAndP = [[AddressAndPort alloc] init];
                    aAndP.address = [NSString stringWithCString:addressStr encoding:kCFStringEncodingUTF8];
                    aAndP.port = port;
                    [retVal addObject:aAndP];
                }
            }
        }
        return retVal;
    
    }
    
    
    @end
    
    
    @implementation AddressAndPort
    @end
    

    [Yes, I have no fear of creating lots of NSObject instances...]

提交回复
热议问题