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