最新の記事
カテゴリ
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧
|
Java +connector/j + MySQLで iPhoneアプリ用のサーバーを書いていたのだが、NSStreamの動作が 若干おかしく、仕様通りに動作しない。
"connection reset by peer"などのエラーが起きると、仕様では、eventCodeとしてNSStreamEventErrorOccurredを送ってくるのだが、実際にはNSStreamEventHasBytesAvailableが送られ、そのまま read:maxLengthメソッドを呼ぶと、-1(0xffffffff)を返してくる。 なので、リード長(read:maxLengthの戻り値が -1の場合は、下のコードの太字部分のように一度ハンドラーを抜けてやる。そうすると次のターンでNSStreamEventErrorOccurredが送られてくる。 - (void)stream:(NSStream *)stream handleEvent: (NSStreamEvent)eventCode { ... case NSStreamEventHasBytesAvailable: { if( !data ) { data = [ [ NSMutableData data ] retain ]; } uint8_t buf[1024]; unsigned int len = [ (NSInputStream *)stream read: buf maxLength: 1024 ]; if( len == 0xffffffff ) { return; } else if( len > 0 ) { [ data appendBytes: (const void *)buf length: len ]; } } break; case NSStreamEventEndEncountered: { [ stream close ]; dataIsReady = YES; if( callbackFunc ) { callbackFunc( Stream::NO_ERROR, userData ); } } break;
by ngc1208
| 2009-01-29 23:45
| iPhone
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ファン申請 |
||