我是iOS开发的新手。我正在尝试创建一个读写流。我正在使用CFNetworking编程指南的示例来尝试使用。
我正在尝试在运行循环上安排读取流来解决流阻塞问题。我马上遇到了问题。如何使用CFHhostCreateWithAddress创建CFHost对象?以下是我到目前为止的情况:
NSString *address = @"irc.ubuntu.net";
CFDataRef addressDataRef = (CFDataRef)[address dataUsingEncoding:NSASCIIStringEncoding];
CFHostRef host = CFHostCreateWithAddress(kCFAllocatorDefault, addressDataRef);
//Create Read and Write Stream
CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host, 8008, &readStream, &writeStream);
第二线炸弹。有人可以告诉我如何创建CFHostRef吗?
非常感谢!
答案 0 :(得分:2)
documentation表示CFHostCreateWithAddress()的第二个参数必须是“包含主机地址的sockaddr结构的CFDataRef对象。该值不能为NULL。”
您正在传递一个代表“irc.ubuntu.net”的CFDataRef,它绝不是一个sockaddr结构。
使用CFHostCreateWithName:
CFHostRef CFHostCreateWithName (
CFAllocatorRef allocator,
CFStringRef hostname
);
您可能知道,您可以将NSString *强制转换为CFStringRef,或者使用宏CFSTR()创建一个常量CFStringRef。
答案 1 :(得分:0)
+ (NSData *)dataForIPAddress:(NSString *)address {
struct addrinfo hints;
struct addrinfo *result = NULL;
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_NUMERICHOST;
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
int errorStatus = getaddrinfo([address cStringUsingEncoding:NSASCIIStringEncoding], NULL, &hints, &result);
if (errorStatus != 0) return nil;
CFDataRef addressRef = CFDataCreate(NULL, (UInt8 *)result->ai_addr, result->ai_addrlen);
if (addressRef == nil) return nil;
freeaddrinfo(result);
return [(NSData *)addressRef autorelease];
}