2012-08-22 16 views
7

Co jest nie tak z poniższym kodem? Używam AsyncSocket do łączenia się z serwerem proxy SOCKS i ustawiania ustawień proxy na metodzie delegata onSocketWillConnect. Jeśli pominę połączenia z CFReadStreamSetProperty i CFWriteStreamSetProperty, połączenie z gniazdem będzie przebiegać płynnie. W przeciwnym razie dostaję [Nie zatrzymuję typu] na zdekapitalizowanej instancji bez śladu stosu śledzenia (może to być związane z CFNetwork?). Czy ktoś ma pojęcie, co daje?CFStream ulega awarii po ustawieniu konfiguracji 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

Nikt tego wcześniej nie spotkał? – LaN

+0

Kiedy dokładnie ten kod ulega awarii? Mam podobny kod w użyciu tutaj (przy użyciu GCDAsyncSocket), który działa dobrze. Czy kod ulega natychmiastowej awarii po wywołaniu 'CFReadStreamSetProperty'? – yfrancis

+0

Zawiesza się po uzgadnianiu SOCKS. Myślę, że ma to coś wspólnego z handshake SOCKSv4, ponieważ nie ulega awarii podczas połączenia na porcie SOCKSv5 przy użyciu tego samego kodu. – LaN

Odpowiedz

1

Z dokumentacji CFReadStream:

właściwości, które można ustawić skonfigurować zachowanie strumienia i mogą być modyfikowane tylko w określonych porach, takich jak przed strumień został otwarty. (W rzeczywistości należy założyć, że można ustawić właściwości tylko przed otwarciem strumienia, chyba że zaznaczono inaczej.)

onSocketWillConnect może być za późno, aby ustawić te właściwości.

+0

Tak, właściwości strumienia gniazda należy ustawić przed otwarciem (w miarę możliwości). Ale tak nie jest, ponieważ zgodnie z nazwą metody, 'onSocketWillConnect' nazywa się _before_ gniazdo jest otwarte. [Źródło AsyncSocket] (https://github.com/lanavelino/CocoaAsyncSocket/blob/master/RunLoop/AsyncSocket.m) – LaN

Powiązane problemy