我有一个CFDataRef(我甚至不确定,为什么我再使用CFData和Socket ..),它包含一个客户端地址(一个struct sockaddr_in),我需要获取IP和端口。不幸的是,没有直接的方法来获得它们。
因此我尝试了以下内容:
CFDataRef clientAddress = ...; //defined somewhere else, contains a sockaddr_in
struct sockaddr_in clientAddress2;
clientAddress2 = *(struct sockaddr_in*)CFDataGetBytePtr(clientAddress);
(不要认真对待这些名字,它们只是出于本例的目的)。 不幸的是,CFDataGetBytePtr的执行似乎崩溃,因为我在运行我的应用程序时遇到“EXC_BAD_ACCESS(code = 2,address = 0x0)”错误。
从包含sockaddr_in的CFDataRef获取IP和端口的最佳方法是什么?
谢谢!
答案 0 :(得分:3)
您可以将 CFDataRef 转换为 NSData ,而不是将 BYTES 分配给 sockaddr 。
如果地址可能是IP6或IP4,则检查INET FAMILY,然后将 BYTES 分配给正确的结构( sockaddr_in 表示IP4或 sockaddr_in6 for IP6)
例如,假设地址是 CFDataRef地址
类型的值 NSString *addressString;
int port=0;
struct sockaddr *addressGeneric;
struct sockaddr_in addressClient;
NSData *myData = (__bridge NSData *)address;
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=@"Error on get family type.";
break;
}
NSLog(@"Client Address: %@",addressString);
这是输出
2013-08-25 12:22:35.308 FGWakeService [9283:303] 客户地址:IP4:192.168.69.38端口:58614