设置 SOCKS 代理配置后 CFStream 崩溃

Posted

技术标签:

【中文标题】设置 SOCKS 代理配置后 CFStream 崩溃【英文标题】:CFStream crashes after setting SOCKS proxy config 【发布时间】:2012-08-22 09:50:09 【问题描述】:

下面的代码有什么问题?我使用 AsyncSocket 连接到 SOCKS 代理并在 onSocketWillConnect 委托方法上设置代理设置。如果我省略对CFReadStreamSetPropertyCFWriteStreamSetProperty 的调用,套接字连接将顺利进行。否则,我在没有可跟踪堆栈跟踪的已释放实例上得到 [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);

【问题讨论】:

以前没有人遇到过这种情况? 这段代码到底什么时候崩溃?我在这里使用了类似的代码(使用 GCDAsyncSocket),效果很好。调用CFReadStreamSetProperty时代码会立即崩溃吗? 在 SOCKS 握手后崩溃。我认为这与 SOCKSv4 握手有关,因为它在使用相同代码连接到 SOCKSv5 端口时不会崩溃。 你有没有发现这个问题? 不幸的是,没有。除了 SOCKSv4 似乎触发了问题而不是 SOCKSv5 之外,我没有机会对此进行进一步调查。不过,欢迎提出想法。 【参考方案1】:

来自CFReadStream的文档:

可以设置的属性配置流的行为,并且只能在特定时间修改,例如在打开流之前。 (实际上,除非另有说明,否则您应该假设只能在打开流之前设置属性。)

onSocketWillConnect 设置这些属性可能为时已晚。

【讨论】:

是的,套接字流属性要在打开之前设置(尽可能)。但情况并非如此,根据方法名称,onSocketWillConnect 在套接字打开之前被调用。 AsyncSocket Source

以上是关于设置 SOCKS 代理配置后 CFStream 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

iOS 使用socks5代理服务器

Git 配置使用代理

手机浏览器如何设置socks5代理?

如何为chrome浏览器设置socks5代理?

如何为chrome浏览器设置socks5代理

socks5代理使用和安装配置