Какао Читать NSInputStream из FTP-соединения - PullRequest
0 голосов
/ 06 апреля 2010

Мне (по-видимому) удается установить 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 довольно ужасным для отладки (никаких исключений или сообщений об ошибках при неудачных шагах, как всегда).

  • Чак

1 Ответ

0 голосов
/ 06 апреля 2010

См. Опрос в сравнении с расписанием цикла выполнения . Обратите внимание на ключевое слово против .

Кроме того, я не думаю, что справедливо обвинять возможности отладки Xcode. XCode является IDE и хорошо работает для отладки. API - это то, что должно вызывать исключения (или возвращать ноль), когда что-то идет не так, и у меня никогда не было проблем с установкой точки останова на objc_exception_throw() или -[NSException raise], чтобы перехватывать исключения во время моих сеансов отладки.

Еще один момент, на который следует обратить внимание: у вас нет защитного кода вообще. Это означает, что вы игнорируете возможность того, что соединение может быть не установлено успешно. Часть обнаружения ошибок заключается в том, что ваш собственный код обнаруживает и обрабатывает сбои, особенно там, где задействованы сетевые коммуникации.

...