2012-08-22 12 views
7

¿Qué pasa con el código siguiente? Yo uso AsyncSocket para conectarme a un proxy SOCKS y establezco la configuración del proxy en el método delegado onSocketWillConnect. Si omito las llamadas a CFReadStreamSetProperty y CFWriteStreamSetProperty, la conexión del socket se realizará sin problemas. De lo contrario, obtengo un [Not A Type reten] en una instancia desasignada sin rastro de pila rastreable (¿Podría estar relacionado con CFNetwork?). ¿Alguien tiene alguna idea de lo que da?CFStream falla después de configurar SOCKS proxy config

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); 
+0

¿Nadie ha encontrado esto antes? – LaN

+0

¿Cuándo se bloquea exactamente este código? Tengo un código similar en uso aquí (usando GCDAsyncSocket) que funciona bien. ¿El código se bloquea inmediatamente cuando llamas a 'CFReadStreamSetProperty'? – yfrancis

+0

Se cuelga después del saludo de SOCKS. Creo que tiene algo que ver con el intercambio de información de SOCKSv4, ya que no se cuelga cuando se conecta en un puerto SOCKSv5 con el mismo código. – LaN

Respuesta

1

De la documentación de CFReadStream:

propiedades que se pueden establecer configurar el comportamiento de la corriente y pueden ser modificables solamente en determinados momentos, como antes se ha abierto la corriente. (De hecho, se debe asumir que se puede establecer propiedades sólo antes de abrir la corriente, a menos que se indique lo contrario.)

onSocketWillConnect puede ser demasiado tarde para establecer esas propiedades.

+0

Sí, las propiedades del flujo de socket se deben establecer antes de abrir (tanto como sea posible). Pero este no es el caso, según el nombre del método, 'onSocketWillConnect' se llama _antes de que se abra el socket. [AsyncSocket Source] (https://github.com/lanavelino/CocoaAsyncSocket/blob/master/RunLoop/AsyncSocket.m) – LaN

Cuestiones relacionadas