2010-11-23 64 views
0

聯網我想實現異步TCP與runloop聯網。 目前我管理連接,但是當我嘗試發送的東西我得到-1個字節已經被寫入 - 但CFWriteStreamCopyError返回null。下面異步CFStream與runloop

代碼示例中,第一功能連接,第二發送一個簡單的消息。 任何幫助將不勝感激,包括隨機錯誤斑點(我是新來的Objective-C和iPhone開發一般)。

struct header 
{ 
    uint32_t length; 
    uint32_t type; 
} header; 

- (void) connect 
{ 
    NSLog(@"Attempting to (re)connect to %@:%d", m_host, m_port); 
    while(TRUE) 
    { 
     CFHostRef host = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)m_host); 
     if (!host) 
     { 
      NSLog(@"Error resolving host %@", m_host); 
      [NSThread sleepForTimeInterval:5.0]; 
      continue; 
     } 
     CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host , m_port, &m_in, &m_out); 
     CFRelease(host); 

     if (!m_in) 
     { 
      NSLog(@"Error"); 
     } 

     CFStreamClientContext context = {0, self,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, CFRunLoopGetCurrent(),kCFRunLoopCommonModes); 
     } 


     BOOL success = CFReadStreamOpen(m_in); 
     CFErrorRef 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"); 
      break; 
     } 
    } 


    [self startSession]; 
} 

- (void) startSession 
{ 
    struct header hh; 
    hh.type = RTR_CREATE_SESSION; 
    hh.length = 0; 
    CFIndex res = CFWriteStreamWrite(self.m_out, (const UInt8*)&hh, sizeof(hh)); 
    NSLog(@"Written %d", res); 

    CFErrorRef error = CFWriteStreamCopyError(self.m_out); 
    if (error) 
    { 
     NSLog(@"Read error %s : %d", CFErrorGetDomain(error), CFErrorGetCode(error)); 
     CFRelease(error); 
    } 
} 

回答

0

想通了,我忘了開寫流,以及:

CFWriteStreamOpen(m_out);