2010-04-06 3 views
0

(분명히) FTP 연결을 관리하지만 그로부터 아무것도 읽지 못하고 좋은 이유가 있습니다. 연결이 시간 초과 될 때까지 읽기에 도달하지 못합니다.코코아 FTP 연결에서 NSInputStream을 읽습니다.

헤더 :

NSInputStream *iStream; 
NSOutputStream *oStream; 

구현 :

내가 이것을 사용 eventhandling를 들어
 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로 전환하라는 요청을 보내지 않았습니다.

Xcode가 디버깅을 위해 매우 끔찍한 것을 발견하면 도움을 주실 수 있습니다. (실패한 단계에 대해서는 예외 또는 오류 메시지가 있습니다.)

답변

0

Polling Versus Run-Loop Scheduling를 참조하십시오. 이라는 키워드를 유의하십시오.

또한 Xcode의 디버깅 기능을 비난하는 것이 적절하지 않다고 생각합니다. Xcode는 IDE이며 디버깅을 위해 잘 작동합니다. API는 무언가가 잘못되었을 때 예외 (또는 무응답)를 발생시켜야하며, 디버깅 세션 중에 예외를 잡기 위해 objc_exception_throw() 또는 -[NSException raise]에 중단 점을 설정하는 데 전혀 문제가 없었습니다.

또 다른 고려해야 할 사항 : 귀하는 어떠한 보호 코드도 가지고 있지 않습니다. 즉, 연결이 성공적으로 이루어지지 않을 가능성을 무시하고 있음을 의미합니다. 오류 감지의 일부는 특히 네트워크 통신이 관련된 경우 사용자 자신의 코드가 오류를 감지하고 처리하는지 확인하는 것입니다.

+0

링크를 제공해 주셔서 감사합니다. xcode에 대한 공격과 비슷한 것으로 보이는 유효 지점. 그러나 내가 읽은 경우에만 내 폴링 믹스가 있습니다. 의심의 여지가 실수이며, 내가 그것을 제거했습니다, 나는 아직도 스트림이 사용할 수있는 바이트를 가지고 응답을받지 않습니다. 서버 측에서 연결되는 것을 볼 수 있고 서버가 "220"(ftp) hello 메시지를 보내는 것처럼 연결이 이루어 졌는지 확인할 수 있습니다. – James

+0

- (void) stream : (NSStream *) aStream 핸들 이벤트 : (NSStreamEvent) eventCode { if (aStream == iStream) { [self handleInputStreamEvent : eventCode]; } else if (aStream == oStream) { [self handleOutputStreamEvent : eventCode]; }} - (무효) handleInputStreamEvent (NSStreamEvent)이 { 스위치 (EVENTCODE) { 경우 EVENTCODE NSStreamEventHasBytesAvailable : [자체의 readBytes]; 휴식; } } 은 스트림 이벤트를 처리하도록 설정 한 것입니다. – James

+0

관련 코드가있는 원래 게시물을 업데이트하는 것이 가장 좋습니다. 댓글에서 코드 형식이 지정되지 않았습니다. 명확하게하기 위해 원래 질문의 코드 목록을 확실히 업데이트해야합니다. –