2012-08-22 15 views
7

सेट करने के बाद CFStream क्रैश हो गया है नीचे दिए गए कोड में क्या गलत है? मैं सॉक्स प्रॉक्सी से कनेक्ट करने के लिए AsyncSocket का उपयोग करता हूं और onSocketWillConnect प्रतिनिधि विधि पर प्रॉक्सी सेटिंग्स सेट करता हूं। अगर मैं CFReadStreamSetProperty और CFWriteStreamSetProperty पर कॉल छोड़ देता हूं तो सॉकेट कनेक्शन आसानी से अनुसरण करेगा। अन्यथा, मुझे एक डेलोकॉक्टेड इंस्टेंस पर एक [नहीं एक प्रकार का रखरखाव] मिलता है जिसमें कोई ट्रेस करने योग्य स्टैक ट्रेस नहीं होता है (यह सीएफनेटवर्क से संबंधित हो सकता है?)। क्या किसी को कोई विचार है जो देता है?सॉफ़्ट प्रॉक्सी कॉन्फ़िगरेशन

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

किसी को भी इससे पहले सामना नहीं हुआ है? – LaN

+0

जब यह कोड वास्तव में क्रैश करता है? मेरे पास यहां उपयोग में समान कोड है (GCDAsyncSocket का उपयोग करके) जो ठीक काम करता है। जब आप 'CFReadStreamSetProperty' कहते हैं तो कोड तुरंत क्रैश हो जाता है? – yfrancis

+0

यह सॉक्स हैंडशेक के बाद दुर्घटनाग्रस्त हो जाता है। मुझे लगता है कि SOCKSv4 हैंडशेक के साथ इसका कुछ संबंध है क्योंकि एक ही कोड का उपयोग करते हुए SOCKSv5 पोर्ट पर कनेक्ट करते समय यह क्रैश नहीं होता है। – LaN

उत्तर

1
CFReadStream के प्रलेखन से

:

गुण धारा के व्यवहार कॉन्फ़िगर और केवल इस तरह के पहले धारा खोल दिया गया है के रूप में विशेष रूप से समय पर परिवर्तनीय हो सकता है सेट किया जा सकता है। (वास्तव में, आप मान लेना चाहिए आप केवल धारा खोलने से पहले गुण सेट कर सकते हैं कि यदि उल्लेख नहीं किया।)

onSocketWillConnect उन गुणों को सेट करने बहुत देर हो चुकी हो सकता है।

+0

हां, सॉकेट स्ट्रीम गुणों को खोलने से पहले सेट किया जाना चाहिए (जितना संभव हो सके)। लेकिन यह मामला नहीं है, विधि नाम के अनुसार, 'onSocketWillConnect' को _before_ सॉकेट खोला जाता है। [AsyncSocket स्रोत] (https://github.com/lanavelino/CocoaAsyncSocket/blob/master/RunLoop/AsyncSocket.m) – LaN

संबंधित मुद्दे