FINもないのにNSStreamEventEndEncounteredちょっとiOS用にネットワークプログラムを書いていたのだが、どうにも解せない。NSInputStreamからreadすると0が返ってくることがある。いや、ブロックすべきだろう。tcpdumpを取ると、0が返って来た後もサーバはバシバシpushして来て、それに堂々とackを返している(シミュレータで実行しているので、OSXのターミナルでtcpdumpが取れるのだ)。iPadにダウンロードして試してもやはり途中で止まってしまう。試すと、あっと言う間にNSStreamEventEndEncounteredが通知される。シミュレータで実行すると、これまたサーバは呑気にPUSHして来てOSX側はACKを返している(のが延々とサーバの気が済むまで続く)。何このアプリケーション置いてきぼりストリーム?こんなおかしな実装は無いだろう(ドキュメントにもNSStreamEventEndEncounteredは、ストリームのお尻で通知とか書いてある)と思うのだが、どうやってもそうなる。やってみてもエラーになる。閉じられたから後はcloseメッセージを送るしかないようだ。水面下ではサーバにACKを返しまくっているんだよなぁ。closeメッセージを送ると、こちらからFIN立てて送るし、ますますわけわからない(FINを送るってことはソケットはちゃんと抱えているわけだが、しかしストリームは尽きたと判断しているというのがわけわからん)。して、読み込みバッファがフルになると、ソケットのレイヤーでは特に何もしないけど、アプリケーションのレイヤーでは尽きたと判断するってことかなぁ。400バイトくらいなんじゃないかというくらいにあっという間にreadメッセージに0が返ったりEndEncoutneredが返ったりするんだけど、拡大するためのメッセージも見つからないし)。(PUSHに対して何も考えずにACKを返しているソケットより下のレイヤーもおかしい。アプリケーションがバッファを空にするまではACKを返さなければ良いわけじゃん)こういうのがまさにアップルってことなのかなぁ(と不思議に思うのだが、さてどうすべきなんだろうか)。