CFStream在设置SOCKS代理配置后崩溃

7
下面的代码有什么问题?我使用AsyncSocket连接到一个SOCKS代理,并在onSocketWillConnect委托方法中设置代理设置。如果我省略对CFReadStreamSetProperty和CFWriteStreamSetProperty的调用,则套接字连接将顺利进行。否则,我会得到一个[Not A Type retain]错误,没有可追踪的堆栈跟踪(可能与CFNetwork有关)。有人知道是什么原因吗?
CFDictionaryRef proxyDict = CFNetworkCopySystemProxySettings();
CFMutableDictionaryRef socksConfig = CFDictionaryCreateMutableCopy(NULL, 0, proxyDict);
CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSProxyHost, CFSTR("192.168.1.148"));
CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSProxyPort, (__bridge CFNumberRef)[NSNumber numberWithInt:3129]);
CFDictionarySetValue(socksConfig, kCFStreamPropertySOCKSVersion, kCFStreamSocketSOCKSVersion4);

// set SOCKS for read streams
CFReadStreamRef readStream = [sock getCFReadStream];
if (!CFReadStreamSetProperty(readStream, kCFStreamPropertySOCKSProxy, socksConfig)) {
  CFStreamError error = CFReadStreamGetError(readStream);
  NSLog(@"[SEVERE] Web Socket Read Stream Error: %ld[%ld]", error.domain, error.error);
}

// set SOCKS for write stream
CFWriteStreamRef writeStream = [sock getCFWriteStream];
if (!CFWriteStreamSetProperty(writeStream, kCFStreamPropertySOCKSProxy, socksConfig)) {
  CFStreamError error = CFWriteStreamGetError(writeStream);
  NSLog(@"[SEVERE] Web Socket Write Stream Error: %ld[%ld]", error.domain, error.error);
}

// Release
CFRelease(socksConfig);
CFRelease(proxyDict);

有人之前遇到过这个问题吗? - LaN
这段代码到底什么时候崩溃了?我这里使用的类似代码(使用GCDAsyncSocket)都正常工作。你调用CFReadStreamSetProperty时,代码会立即崩溃吗? - yfrancis
它在SOCKS握手后崩溃。我认为这与SOCKSv4握手有关,因为当使用相同的代码连接到SOCKSv5端口时,它不会崩溃。 - LaN
你有没有碰巧解决这个问题? - yfrancis
很遗憾,我没有机会进一步调查这个问题,除了 SOCKSv4 似乎触发了这个问题而不是 SOCKSv5。不过欢迎提出想法。 - LaN
1个回答

1
从CFReadStream的文档中:
可以设置的属性可以配置流的行为,并且只能在特定时期修改,例如在流打开之前。 (事实上,您应该假设只能在打开流之前设置属性,除非另有说明。)
onSocketWillConnect可能太迟了来设置这些属性。

是的,套接字流属性应尽可能在打开之前设置。但事实并非如此,根据方法名称,“onSocketWillConnect”在套接字打开之前被调用。AsyncSocket Source - LaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接