2011-01-06 4 views
0

Obj-C/Cocoa로 번역하려고하는 Python 코드가 있습니다. 네트워크 연결이 필요합니다. 초기화 문자열이 일반 텍스트로 전송 된 다음 연결이 보안됩니다. 는 기본적으로, 다음과 같이 작동 동일한 소켓을 통한 안전하고 보안되지 않은 연결

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect((host,port)) 
sock.send(...) 
sock.recv(...) 
sslSock = ssl.wrap_socket(sock) 
sslSock.send(...) 
sslSock.recv(...) 

지금까지, 나는 다음 있습니다. 내가 적절하게 NSStreamEventHasBytesAvailableNSStreamEventHasSpaceAvailable 이벤트를 처리

NSSocketNativeHandle *socketHandle = [[outputStream propertyForKey:(NSString *)kCFStreamPropertySocketNativeHandle] bytes]; 

다음 NSStreamEventOpenCompleted가 전송되면

CFReadStreamRef readStream; 
CFWriteStreamRef writeStream; 

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)HOST, PORT, &readStream, &writeStream); 

inputStream = (NSInputStream *)readStream; 
[inputStream setDelegate:self]; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

outputStream = (NSOutputStream *)writeStream; 
[outputStream setDelegate:self]; 
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

[inputStream open]; 
[outputStream open]; 

, 나는 네이티브 소켓 핸들을 저장 : 우선은 소켓 연결하고, R/W 스트림을 생성 . 그런 다음 저장된 소켓 핸들에서 두 개의 새로운 스트림을 만들고 SSL 등록 정보를 설정하십시오.

[inputStream close]; 
[outputStream close]; 
[inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

CFStreamCreatePairWithSocket(kCFAllocatorDefault, *socketHandle, &readStream, &writeStream); 

inputStream = (NSInputStream *)readStream; 
[inputStream setDelegate:self]; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[inputStream setProperty:NSStreamSocketSecurityLevelSSLv3 forKey:NSStreamSocketSecurityLevelKey]; 

outputStream = (NSOutputStream *)writeStream; 
[outputStream setDelegate:self]; 
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[outputStream setProperty:NSStreamSocketSecurityLevelSSLv3 forKey:NSStreamSocketSecurityLevelKey]; 

[inputStream open]; 
[outputStream open]; 

그리고 지금까지 얻은 것입니다. NSStreamEventOpenCompleted 이벤트는 새 스트림 모두에서 호출되지만 NSStreamEventHasBytesAvailableNSStreamEventHasSpaceAvailable 이벤트는 발생하지 않습니다. 내가 뭘 잘못하고 있는거야?

답변

1

내 문제는 두 가지로 보입니다.

  1. CFStreamCreatePairWithSocketToHost 통한 연결을 생성

    kCFStreamPropertyShouldCloseNativeSocket 속성 자동 TRUE로 설정된다. 거짓이어야합니다.

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)HOST, PORT, &readStream, &writeStream); 
    inputStream = (NSInputStream *)readStream; 
    [inputStream setDelegate:self]; 
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [inputStream setProperty:(id)kCFBooleanFalse forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket]; 
    
  2. SSL을 올바르게 설정하지 않았습니다.

    NSMutableDictionary *sslSettings = [[NSMutableDictionary alloc] init]; 
    [sslSettings setObject:NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel]; 
    [sslSettings setObject:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot]; 
    [sslSettings setObject:HOST forKey:(NSString *)kCFStreamSSLPeerName]; 
    [inputStream setProperty:sslSettings forKey:(NSString *)kCFStreamPropertySSLSettings]; 
    [inputStream open]; 
    
+0

안녕하세요, 죄송합니다 다시 오래된 질문을 제기 할 수 있지만 같은 문제가 있습니다. 소켓으로 무언가를하고 보안을 위해 업그레이드해야합니다. 설명 된 메서드를 시도했지만 여전히 NSStreamEventHasBytesAvailable 이벤트를받지 못합니다. 심지어 보안 업그레이드없이 스트림을 다시 만들려고했지만 여전히 동일합니다. iPad에서 iOS 6을 실행하고 있습니다. 코드가 여전히 작동합니까? 또는 어쩌면 당신은 약간 개선을 만들었습니까? – user1264176

관련 문제