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(...)
지금까지, 나는 다음 있습니다. 내가 적절하게
NSStreamEventHasBytesAvailable
및
NSStreamEventHasSpaceAvailable
이벤트를 처리
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
이벤트는 새 스트림 모두에서 호출되지만 NSStreamEventHasBytesAvailable
및 NSStreamEventHasSpaceAvailable
이벤트는 발생하지 않습니다. 내가 뭘 잘못하고 있는거야?
안녕하세요, 죄송합니다 다시 오래된 질문을 제기 할 수 있지만 같은 문제가 있습니다. 소켓으로 무언가를하고 보안을 위해 업그레이드해야합니다. 설명 된 메서드를 시도했지만 여전히 NSStreamEventHasBytesAvailable 이벤트를받지 못합니다. 심지어 보안 업그레이드없이 스트림을 다시 만들려고했지만 여전히 동일합니다. iPad에서 iOS 6을 실행하고 있습니다. 코드가 여전히 작동합니까? 또는 어쩌면 당신은 약간 개선을 만들었습니까? – user1264176