代码之家  ›  专栏  ›  技术社区  ›  Omry Yadan

使用runloop的异步cfstream网络

  •  0
  • Omry Yadan  · 技术社区  · 14 年前

    我正在尝试用runloop实现异步TCP网络。 目前,我设法连接,但当我尝试发送一些东西时,我得到了-1个字节已经写入-但cfWriteStreamCopyError返回空。

    下面的代码示例,第一个函数连接,第二个发送简单消息。 任何帮助都将得到赞赏,包括随机的错误发现(我对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);
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Omry Yadan    14 年前

    我知道了,我也忘了打开写流:

    CFWriteStreamOpen(m_out);