2012-08-22 6 views
7

Cosa c'è di sbagliato nel codice qui sotto? Uso AsyncSocket per connettersi a un proxy SOCKS e impostare le impostazioni del proxy sul metodo delegato onSocketWillConnect. Se ometto le chiamate a CFReadStreamSetProperty e CFWriteStreamSetProperty, la connessione socket procederà senza intoppi. Altrimenti, ottengo [Not A Type retain] su un'istanza deallocata senza traccia tracciabile dello stack (Potrebbe trattarsi di CFNetwork?). Qualcuno ha qualche idea di ciò che dà?CFStream si blocca dopo aver impostato la configurazione del proxy SOCKS

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

Nessuno lo ha mai incontrato prima? – LaN

+0

Quando si blocca esattamente questo codice? Ho un codice simile in uso qui (usando GCDAsyncSocket) che funziona bene. Il codice si arresta immediatamente quando si chiama 'CFReadStreamSetProperty'? – yfrancis

+0

Si blocca dopo l'handshake SOCKS. Penso che abbia qualcosa a che fare con l'handshake SOCKSv4 poiché non si blocca quando si connette su una porta SOCKSv5 usando lo stesso codice. – LaN

risposta

1

Dalla documentazione di CFReadStream:

proprietà che possono essere impostate configurare il comportamento del flusso e può essere modificabile solo in particolari momenti, come ad esempio prima che il flusso è stato aperto. (In realtà, si deve presumere che si può impostare le proprietà solo prima di aprire il flusso, se non diversamente specificato.)

onSocketWillConnect potrebbe essere troppo tardi per impostare tali proprietà.

+0

Sì, le proprietà del flusso di socket devono essere impostate prima dell'apertura (il più possibile). Ma questo non è il caso, come per il nome del metodo, 'onSocketWillConnect' è chiamato _before_ il socket è aperto. [AsyncSocket Source] (https://github.com/lanavelino/CocoaAsyncSocket/blob/master/RunLoop/AsyncSocket.m) – LaN

Problemi correlati