0

私は(どうやら)ftp接続を確立できましたが、そこから何も読み取れませんでした。正当な理由があります。接続がタイムアウトするまで、読み取りに到達しません。

これが私のコードです:

ヘッダ:

NSInputStream *iStream;
NSOutputStream *oStream;

実装:

        NSHost *host = [NSHost hostWithAddress:@"127.0.0.1"];
        [iStream open]; // SOLUTION changes
        [NSStream getStreamsToHost:host port:3333 inputStream:&iStream outputStream:&oStream];

        NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:1];
        [settings setObject:(NSString *)NSStreamSocketSecurityLevelTLSv1 forKey:(NSString *)kCFStreamSSLLevel];
        [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
        [settings setObject:@"127.0.0.1" forKey:(NSString *)kCFStreamSSLPeerName];

        /*[iStream retain];   
        [iStream setDelegate:self];
        [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        CFReadStreamSetProperty((CFReadStreamRef)iStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
        [iStream setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey];*/
        //[iStream open]; SOLUTION changes: moved up

イベント処理には、 http: //www.cocoadev.com/index.pl? NSStreamに基づいてこれを使用します。

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    if (aStream == iStream) {
        [self handleInputStreamEvent:eventCode];
    } else if (aStream == oStream) {
        [self handleOutputStreamEvent:eventCode];
    }
}
- (void)handleInputStreamEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {
    // SOLUTION changes: new inputstream handler
    case NSStreamEventHasBytesAvailable:
        if(!_data) {
            _data = [[NSMutableData data] retain];
        }
        uint8_t buf[1024];
        unsigned int len = 0;
        len = [(NSInputStream *)iStream read:buf maxLength:1024];
        if(len) {
            [_data appendBytes:(const void *)buf length:len];
            [bytesRead setIntValue:[bytesRead intValue]+len];
        }
        [self readBytes];
        break;
    case NSStreamEventOpenCompleted:
        NSLog(@"NSStreamEventOpenCompleted");
        break;
    case NSStreamEventEndEncountered:
        NSLog(@"NSStreamEventEndEncountered");
        break;
    case NSStreamEventErrorOccurred:
        NSLog(@"An error occurred on the input stream.");
        break;
    }
}

最小限に抑えるために、この投稿からoStreamのセットアップを省略しました。

FTPにSSLに切り替えるリクエストをまだ送信していません。

Xcodeはデバッグに非常に恐ろしいと思うので、どんな助けでも大歓迎です(失敗したステップでの例外やエラーメッセージはありません)。

  • チャック
4

1 に答える 1

0

ポーリングと実行ループのスケジューリングを参照してください。キーワードと。に注意してください

さらに、Xcodeのデバッグ機能を非難するのは公平ではないと思います。XcodeはIDEであり、デバッグに非常に適しています。APIは、何か問題が発生したときに例外を発生させる(またはnilを返す)必要があり、デバッグセッション中にブレークポイントを設定しobjc_exception_throw()たり例外をキャッチしたりするのに問題があったことはありません。-[NSException raise]

考慮すべきもう1つのポイント:ガードコードはまったくありません。これは、接続が正常に確立されない可能性を無視していることを意味します。エラー検出の一部は、特にネットワーク通信が関係している場合に、独自のコードが障害を検出して処理することを確認することです。

于 2010-04-06T14:01:30.107 に答える