2011-01-06 30 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のストリームを作成します。次に、格納されているソケットハンドルから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イベントは新しいストリームの両方で呼び出されますが、NSStreamEventHasBytesAvailableNSStreamEventHasSpaceAvailableイベントは発生しません。私が間違っていることは何ですか?

答えて

1

私の問題は2倍だったようです。 CFStreamCreatePairWithSocketToHostを介して接続を作成する場合、kCFStreamPropertyShouldCloseNativeSocketプロパティは自動的にTRUEに設定されている

  1. 。それは偽でなければなりません。

    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

関連する問題