2011-02-28 40 views
1

我是iOS开发新手。我正在尝试创建一个读取和写入流。我正在使用CFNetworking编程指南的例子来尝试工作。iOS - 如何创建一个读写流到网络套接字?

我想在运行循环上安排读取流来解决流阻塞的问题。马上我遇到了问题。我如何使用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?

非常感谢!

回答

2

documentation指出CFHostCreateWithAddress()的第二个参数必须是“包含主机地址的sockaddr结构的CFDataRef对象,该值不能为NULL”。

您正在传递一个表示“irc.ubuntu.net”的CFDataRef,它不是一个sockaddr结构体。

使用CFHostCreateWithName:

CFHostRef CFHostCreateWithName (
    CFAllocatorRef allocator, 
    CFStringRef hostname 
); 

正如你可能知道,你可以投一个NSString *到CFStringRef,或创建一个常数CFStringRef与宏CFSTR()。

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]; 
}