2012-08-22 30 views
7

Có gì sai với mã bên dưới? Tôi sử dụng AsyncSocket để kết nối với một proxy SOCKS và thiết lập các thiết lập proxy trên onSocketWillConnect phương thức ủy nhiệm. Nếu tôi bỏ qua các cuộc gọi đến CFReadStreamSetPropertyCFWriteStreamSetProperty kết nối ổ cắm sẽ hoạt động thông suốt. Khác, tôi nhận được một [Không phải là một loại giữ lại] trên một trường hợp deallocated không có dấu vết stack theo dõi (Nó có thể là CFNetwork liên quan?). Có ai có ý tưởng gì?CFStream bị treo sau khi đặt cấu hình 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

Không ai từng gặp phải điều này trước đây? – LaN

+0

Khi nào mã này gặp sự cố? Tôi có mã tương tự được sử dụng ở đây (sử dụng GCDAsyncSocket) mà hoạt động tốt. Mã có bị lỗi ngay lập tức khi bạn gọi 'CFReadStreamSetProperty' không? – yfrancis

+0

Nó bị treo sau khi bắt tay SOCKS. Tôi nghĩ rằng nó có một cái gì đó để làm với SOCKSv4 bắt tay vì nó không sụp đổ khi kết nối trên một cổng SOCKSv5 bằng cách sử dụng cùng một mã. – LaN

Trả lời

1

Từ các tài liệu của CFReadStream:

Thuộc tính có thể được thiết lập cấu hình hành vi của các dòng và có thể thay đổi được chỉ vào những thời điểm đặc biệt, chẳng hạn như trước dòng đã được mở. (Trên thực tế, bạn nên giả sử rằng bạn chỉ có thể đặt thuộc tính trước khi mở luồng, trừ khi có ghi chú khác.)

onSocketWillConnect có thể đã quá muộn để đặt các thuộc tính đó.

+0

Có, các thuộc tính luồng ổ cắm phải được đặt trước khi mở (càng nhiều càng tốt). Nhưng đây không phải là trường hợp, theo tên của phương thức, 'onSocketWillConnect' được gọi là _before_ socket được mở. [AsyncSocket Source] (https://github.com/lanavelino/CocoaAsyncSocket/blob/master/RunLoop/AsyncSocket.m) – LaN

Các vấn đề liên quan