2012-01-18 1 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オブジェクトのWriteメソッドは、アプリケーションの実行を停止します。

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

EDIT: NSStreamStatus値:

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

をあなたは状況がそれを使用する前にオープンされるまで待機する必要があります。状態Errorに解決するために、悪いURLが数秒(たぶん30秒)かかることがあります。

+0

ありがとうございますが、私はすでに試してみました...違いはありません。すべての場合に、streamStatus = 1およびstreamError =空文字列。 – Gigi

+0

ええ、streamStatusが1の場合は、使用できないことを意味します。詳細は私の編集を参照してください。 – MechEthan

+0

偉大な、それは完全に動作します!どうもありがとうございました! – Gigi

関連する問題