1

WindowsデスクトップアプリケーションからiPhoneアプリに転送するクライアントサーバーを実装しました。ポーリングモード(同期)でNSStreamを使用してデータを転送します。

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

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

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

[inputStream open];
[outputStream open];

すべて正常に動作しますが、存在しないサーバーまたは切断されたサーバーに接続しようとしたり、ポート番号/ IPアドレスが間違っていると、NSOutputStreamオブジェクトのWRITEメソッドがアプリケーションの実行を停止します。

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

タイムアウト制御を挿入してメソッドを管理することはできますか?はいの場合、どうすればよいですか?

NSInputStreamオブジェクトのREADメソッドでも同じ問題が発生すると思います。

誰か助けてくれませんか?

4

1 に答える 1

2

読み取りと書き込みに使用する前に、 NSStreamsstreamStatusと関数を確認してください。streamError詳細については、AppleのNSStreamドキュメントを参照してください。

これも役立つ場合があります:ソケットストリームの設定

編集:NSStreamStatus値:

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

ステータスがオープンになるまで待ってから使用する必要があります。不正なURLがステータスエラーに解決されるまでに数秒(場合によっては30秒)かかる場合があります。

于 2012-01-19T02:09:16.940 に答える