私は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のストリームを作成します。次に、格納されているソケットハンドルから2つの新しいストリームを作成し、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