著作一覧 |
なぜかNSInputStreamが0を返すので、いろいろ試しているうちにこうすれば正しく処理できるという方法がわかったのでメモ。
元々サーバは次のような形式でデータを垂れ流す(簡略化している)。
|長さ(2)|データ|長さ(2)|データ|....
そこで、単純に処理することを考える。
uint8_t lenbuff[2]; uint8_t databuff[256]; // 仮に1データは最大256バイトとする if ([istream read:lenbuff maxlength:2] != 2) エラー; int len = lenbuff[0] * 256 + lenbuff[1]; if ([istream read:databuff maxlength:len) != len) エラー;
このようにすることで、簡単に同期読み込みでは0が返ってくるし、非同期(というのとはちょっと違う気がするがイベントベースの)読み込みではNSStreamEventEndEncouteredが通知される。
予測通り、読み込みバッファのあふれが原因と考えられる。
正しい読み方は読めるだけとにかく読む。そして読み込んだバッファ内で尺取虫する。それですべて解決した。でも、NSLogとってみてみると、それまでのread回数が6×2に対して1程度にしか減っていない。
(メモリが少ないので、カーネルメモリとユーザメモリの2つのバッファのみで済まそうとして、read呼び出しの都度モード切替の巨大なオーバーヘッドがかかる(なので1/12に減るだけで極度にスループットの向上となる)という解釈でいいのかなぁ)
ジェズイットを見習え |