2012-01-18 4 views
1

Windows 데스크톱 애플리케이션에서 iPhone 애플리케이션으로 클라이언트 - 서버 전송을 구현했습니다. NSStream을 폴링 모드로 사용하여 데이터를 전송합니다 (동기식).폴링 모드에서 NSStream으로 애플리케이션 중지 방지

CFReadStreamRef readStream; 
CFWriteStreamRef writeStream; 

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)urlStr, portNo, &readStream, &writeStream); 

inputStream = (NSInputStream *)readStream; 
outputStream = (NSOutputStream *)writeStream; 

[inputStream open]; 
[outputStream open]; 

모두 잘 작동하지만 내가 inexistent 서버 또는 연결이 끊긴 서버 또는 포트 번호/IP 주소를 연결을 시도 할 때 잘못, NSOutputStream 개체의 쓰기 방법, 응용 프로그램 실행을 중지합니다.

const uint8_t *str = (uint8_t *) [strRichiesta cStringUsingEncoding:NSASCIIStringEncoding]; 
[outputStream write:str maxLength:strlen((char*)str)]; 

타임 아웃 제어를 삽입하여 관리 할 수 ​​있습니까? 그렇다면 어떻게 할 수 있습니까?

NSInputStream 개체의 READ 메서드에서도 동일한 문제가 발생한다고 생각합니다.

누군가 나를 도와 줄 수 있습니까?

답변

2

읽기 및 쓰기에 사용하기 전에 NSStream의 'streamStatusstreamError 기능을 확인하십시오. 자세한 내용은 Apple의 NSStream Documentation을 참조하십시오.

이것은 또한 도움이 될 수 있습니다 : Setting Up Socket Streams

편집 : NSStreamStatus 값 :

typedef enum { 
    NSStreamStatusNotOpen = 0, 
    NSStreamStatusOpening = 1, 
    NSStreamStatusOpen = 2, 
    NSStreamStatusReading = 3, 
    NSStreamStatusWriting = 4, 
    NSStreamStatusAtEnd = 5, 
    NSStreamStatusClosed = 6, 
    NSStreamStatusError = 7 
}; 

을 당신은 상태가 그것을 사용하기 전에 열릴 때까지 기다려야 할 것이다. 상태 오류를 해결하기 위해 잘못된 URL이 몇 초 (어쩌면 30 초) 걸릴 수 있습니다.

+0

감사하지만 이미 시도했지만 ... 차이가 없습니다. 모든 경우에 streamStatus = 1 및 streamError = 빈 문자열. – Gigi

+0

예, 1의 streamStatus는 사용할 준비가되지 않았다는 것을 의미합니다. 자세한 내용은 내 편집을 참조하십시오. – MechEthan

+0

좋아요, 완벽하게 작동합니다! 고마워요! – Gigi

관련 문제