2012-07-12 109 views
1

我正在尝试使用CFStream获得简单的HTTP通信,但是使用下面的代码,即使给出无效的URL(wwwww.yahoo.com),我仍然可以获得连接成功。通过CFStream的HTTP请求

有人能指点我这个代码有什么问题吗?我希望调用CFReadStreamOpen()失败,但即使URL不好,它仍然成功。

我一直无法找到一个简单的CFNetwork例子,它可以在ARC上运行HTTP(不使用NSURL)。如果有人知道这样的示例代码,请让我知道。

- (void) test 
{ 

    CFStringRef m_host = CFStringCreateWithCString(NULL, "wwwww.yahoo.com", kCFStringEncodingASCII); 

    int m_port = 80; 
    CFHostRef host; 

    NSLog(@"Attempting to (re)connect to %@:%d", m_host, m_port); 

    { 

     CFReadStreamRef  m_in = NULL; 
     CFWriteStreamRef m_out = NULL; 

     host = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)m_host); 
     if (!host) 
     { 
      NSLog(@"Error resolving host %@", m_host); 
     } 

     CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host , m_port, &m_in, &m_out); 
     CFRelease(host); 

     CFStreamClientContext context = {0, nil,nil,nil,nil}; 


     if (CFReadStreamSetClient(m_in, kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, networkReadEvent, &context)) 
     { 
      CFReadStreamScheduleWithRunLoop(m_in, CFRunLoopGetCurrent(),kCFRunLoopCommonModes); 
     } 

     if (CFWriteStreamSetClient(m_out, kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, networkWriteEvent, &context)) 
     { 
      CFWriteStreamScheduleWithRunLoop(m_out, CFRunLoopGe tCurrent(),kCFRunLoopCommonModes); 
     }   

     BOOL success = CFReadStreamOpen(m_in); 
     CFErrorRef error = CFReadStreamCopyError(m_in); 
     if (!success || (error && CFErrorGetCode(error) != 0)) 
     { 
      NSLog(@"Connect error %s : %ld", CFErrorGetDomain(error), CFErrorGetCode(error)); 
      [NSThread sleepForTimeInterval:5.0]; 
     } 

     success = CFWriteStreamOpen(m_out); 
     error = CFReadStreamCopyError(m_in); 
     if (!success || (error && CFErrorGetCode(error) != 0)) 
     { 
      NSLog(@"Connect error %s : %d", CFErrorGetDomain(error), CFErrorGetCode(error)); 
      [NSThread sleepForTimeInterval:5.0]; 
     } 
     else 
     { 
      NSLog(@"Connected"); 
     } 

    } 
} 

回答

0

对于异步代码(如您的),您需要设置委托并在那里捕获错误。退房http://iphonedevsdk.com/forum/iphone-sdk-development/17542-cfstream-catch-error-in-connection.html

根据苹果开发人员网站的说法,“如果流可以在不阻塞的情况下在后台打开,则此函数总是返回true。”这意味着打开流的请求会在不同的线程中发送出去,因此当您调用该函数并在后台线程上启动连接进程时,该函数将返回true。所有对各个流的读/写调用都会阻塞,直到后台线程完成打开流。如果您在“CFReadStreamOpen(m_in);”上设置了一个断点,您将能够看到此内容。并查看该单行执行后会发生什么。希望这回答你的问题。