2010-11-23 11 views
0

runloopで非同期tcpネットワークを実装しようとしています。 現在、私は接続することができますが、何かを送信しようとすると-1バイトが書き込まれますが、CFWriteStreamCopyErrorはnullを返します。runloopを使用した非同期CFStreamネットワーク

以下のコードサンプルは、最初の関数が接続し、2番目が単純なメッセージを送信します。 ランダムなバグの発見(私は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); 
関連する問題