NSNetService+Util.m 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // NSNetService+Util.m
  3. // OneCable
  4. //
  5. // Created by KaRam Kim on 2017. 2. 15..
  6. // Copyright © 2017년 ntels. All rights reserved.
  7. //
  8. #import "NSNetService+Util.h"
  9. #include <arpa/inet.h>
  10. @implementation NSNetService (Util)
  11. - (NSArray*) addressesAndPorts {
  12. // this came from http://stackoverflow.com/a/4976808/8047
  13. NSMutableArray *retVal = [NSMutableArray array];
  14. char addressBuffer[INET6_ADDRSTRLEN];
  15. for (NSData *data in self.addresses)
  16. {
  17. memset(addressBuffer, 0, INET6_ADDRSTRLEN);
  18. typedef union {
  19. struct sockaddr sa;
  20. struct sockaddr_in ipv4;
  21. struct sockaddr_in6 ipv6;
  22. } ip_socket_address;
  23. ip_socket_address *socketAddress = (ip_socket_address *)[data bytes];
  24. if (socketAddress && (socketAddress->sa.sa_family == AF_INET || socketAddress->sa.sa_family == AF_INET6))
  25. {
  26. const char *addressStr = inet_ntop(
  27. socketAddress->sa.sa_family,
  28. (socketAddress->sa.sa_family == AF_INET ? (void *)&(socketAddress->ipv4.sin_addr) : (void *)&(socketAddress->ipv6.sin6_addr)),
  29. addressBuffer,
  30. sizeof(addressBuffer));
  31. int port = ntohs(socketAddress->sa.sa_family == AF_INET ? socketAddress->ipv4.sin_port : socketAddress->ipv6.sin6_port);
  32. if (addressStr && port)
  33. {
  34. AddressAndPort *aAndP = [[AddressAndPort alloc] init];
  35. aAndP.address = [NSString stringWithCString:addressStr encoding:kCFStringEncodingUTF8];
  36. aAndP.port = port;
  37. [retVal addObject:aAndP];
  38. NSLog(@"Addr : %@", aAndP.address);
  39. NSLog(@"Port : %i", aAndP.port);
  40. }
  41. }
  42. }
  43. return retVal;
  44. }
  45. @end
  46. @implementation AddressAndPort
  47. @end