首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带runloop的异步CFStream网络

带runloop的异步CFStream网络
EN

Stack Overflow用户
提问于 2010-11-24 00:22:30
回答 1查看 1.8K关注 0票数 0

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

代码示例如下,第一个函数连接,第二个发送一条简单的消息。任何帮助都将不胜感激,包括随机的bug定位(我是objective-c和iphone开发的新手)。

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-24 01:52:34

弄清楚了,我也忘了打开write流:

代码语言:javascript
复制
CFWriteStreamOpen(m_out);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4258247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档