NSNetService的address解析IP地址与端口
- (void)netServiceDidResolveAddress:(NSNetService *)sender{
NSLog(@"netServiceDidResolveAddress");
NSData *data = [sender TXTRecordData];
NSDictionary *info = [NSNetService dictionaryFromTXTRecordData:data];
NSDictionary *ipInfo = [self parsingIP:sender];
NSLog(@"parsingIP : %@", ipInfo);
}
#include <arpa/inet.h>
- (NSDictionary *)parsingIP:(NSNetService *)sender{
int sPort = 0;
NSString *ipv4;
NSString *ipv6;
for (NSData *address in [sender addresses]) {
typedef union {
struct sockaddr sa;
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
} ip_socket_address;
struct sockaddr *socketAddr = (struct sockaddr*)[address bytes];
if(socketAddr->sa_family == AF_INET) {
sPort = ntohs(((struct sockaddr_in *)socketAddr)->sin_port);
struct sockaddr_in* pV4Addr = (struct sockaddr_in*)socketAddr;
int ipAddr = pV4Addr->sin_addr.s_addr;
char str[INET_ADDRSTRLEN];
ipv4 = [NSString stringWithUTF8String:inet_ntop( AF_INET, &ipAddr, str, INET_ADDRSTRLEN )];
}
else if(socketAddr->sa_family == AF_INET6) {
sPort = ntohs(((struct sockaddr_in6 *)socketAddr)->sin6_port);
struct sockaddr_in6* pV6Addr = (struct sockaddr_in6*)socketAddr;
char str[INET6_ADDRSTRLEN];
ipv6 = [NSString stringWithUTF8String:inet_ntop( AF_INET6, &pV6Addr->sin6_addr, str, INET6_ADDRSTRLEN )];
}
else {
NSLog(@"Socket Family neither IPv4 or IPv6, can't handle...");
}
}
NSDictionary *data = @{@"type": [sender type],
@"domain": [sender domain],
@"name": [sender name],
@"ipv4": ipv4,
@"ipv6": ipv6,
@"port": [NSNumber numberWithInt:sPort]};
return data;
}
- (void)parsingIP2:(NSNetService *)sender{
NSLog(@"%@",NSStringFromSelector(_cmd));
NSLog(@"----netService didResolveAddress %@ %@ %@ %@", sender.name, sender.addresses, sender.hostName, [sender.addresses firstObject]);
NSArray *addresses = sender.addresses;
[sender startMonitoring];
int port;
NSString *ip;
char addressBuffer[INET6_ADDRSTRLEN];
//服务的IP地址
for(NSData *data in 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)
{
port = port;
ip = [NSString stringWithCString:addressStr encoding:NSASCIIStringEncoding];
NSLog(@"Found service at %s:%d", addressStr, port);
}
}
}
}