2010-11-23 2 views
0

runloop과 함께 비동기 tcp 네트워킹을 구현하려고합니다. 현재 연결할 수 있지만 뭔가를 보내려고하면 -1 바이트가 쓰여지지만 CFWriteStreamCopyError는 null을 반환합니다.runloop을 사용한 비동기 CFStream 네트워킹

아래의 코드 샘플은 첫 번째 함수가 연결되면 두 번째 간단한 메시지를 보냅니다. 무작위 버그 발견 (나는 목표 -c와 iphone 개발을 처음 접했을 때)을 포함한 모든 도움을 주시면 감사하겠습니다.

CFWriteStreamOpen(m_out); 
:
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

그것을 알아 냈어, 나뿐만 아니라 쓰기 스트림을 엽니 다 잊었다
관련 문제