CFStream + SSL 导致 OSStatus 错误 -108

Ste*_*sen 5 iphone ssl networking cocoa-touch cfstream

我有一些代码可以为启用CFStreamSSL/TLS的远程服务器创建一对对象。这段代码在 OS X 上运行得很好,但在 iOS 下运行时,它失败了。这是控制台日志:

2011-04-26 22:39:35.820 RemoteSample[92127:40b] connecting to 192.168.1.187:8099
2011-04-26 22:39:35.825 RemoteSample[92127:40b] INPUT: NSStreamEventOpenCompleted
2011-04-26 22:39:35.825 RemoteSample[92127:40b] OUTPUT: NSStreamEventOpenCompleted
2011-04-26 22:39:35.827 RemoteSample[92127:40b] INPUT: NSStreamEventErrorOccurred
2011-04-26 22:39:35.828 RemoteSample[92127:40b] Error on input stream: The operation couldn’t be completed. (OSStatus error -108.)
2011-04-26 22:39:35.829 RemoteSample[92127:40b] OUTPUT: NSStreamEventErrorOccurred
2011-04-26 22:39:35.829 RemoteSample[92127:40b] Error on output stream: The operation couldn’t be completed. (OSStatus error -108.)
Run Code Online (Sandbox Code Playgroud)

OSStatus 错误 -108 似乎是 memFullErr,这很奇怪,我不太确定该怎么办。这发生在模拟器和设备上。它在 Mac OS X 应用程序中编译和运行时不会出现此问题。只有在为 iOS 构建时才会发生此错误。

花了几个小时尝试各种想法和大量搜索后,我可以使用一些有关下一步的建议。

这是代码:

CFReadStreamRef inCfStream = NULL;
CFWriteStreamRef outCfStream = NULL;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)host, port, &inCfStream, &outCfStream);
if (inCfStream && outCfStream)
{
    CFReadStreamSetProperty(inCfStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

    inStream = NSMakeCollectable(inCfStream);
    outStream = NSMakeCollectable(outCfStream);
    [inStream setDelegate:self];
    [outStream setDelegate:self];
    [inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL forKey:NSStreamSocketSecurityLevelKey];

    NSDictionary *properties = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
                                [NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
                                [NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
                                kCFNull,kCFStreamSSLPeerName,
                                nil];
    if (CFReadStreamSetProperty(inCfStream, kCFStreamPropertySSLSettings, (CFTypeRef)properties) == FALSE)
    {
        NSLog(@"Failed to set SSL properties on read stream.");
    }

    inputBuffer = [[NSMutableData alloc] init];
    [inStream open];
    [outStream open];
}
Run Code Online (Sandbox Code Playgroud)