2010-11-23 6 views
0

J'essaye d'implémenter le réseautage async tcp avec runloop. actuellement, je parviens à me connecter, mais quand j'essaie d'envoyer quelque chose que je reçois que -1 octets ont été écrits - mais CFWriteStreamCopyError renvoie null.Async CFStream mise en réseau avec runloop

exemple de code ci-dessous, la première fonction se connecte, deuxième envoyer un message simple. toute aide sera appréciée, y compris le repérage de bugs aléatoires (je suis nouveau dans le développement de l'objectif-c et de l'iphone en général).

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

Répondre

0

figured it out, j'ai oublié d'ouvrir le flux d'écriture ainsi:

CFWriteStreamOpen(m_out); 
Questions connexes