[HOME][本書サポートページ][Javaネットワーキングの細部]

相手ピアが××したらこちらピアに何が起きる?


update: 080617
相手ピアが××をした
こちらは##していた
入力ストリームをreadしていた出力ストリームにwriteしていたselectしていたI/O以外の計算処理をしていたsleepまたはwaitしていた
こちらピアに起きることこちらピアに起きることこちらピアに起きることこちらピアに起きることこちらピアに起きること
Socketをcloseしたread()は-1を返す. readLine()はnullを返す. そのほかのreadXXX()はEOFExceptionを投げる.SocketException: connection resetを投げる(すぐではないことが多い)OP_READでセレクトし, その後のreadは左記'readしていた'の場合と同じ結果に. 次のread/writeで左記の状態になる.次のread/writeで左記の状態になる.
出力ストリームをcloseした --相手ピアのSocketがcloseされるので,こちら側に起きることは上(Socketのclose)と同じ--
入力ストリームをcloseした --相手ピアのSocketがcloseされるので,こちら側に起きることは上(Socketのclose)と同じ--
出力をshutdownした --read中のこちら側に起きることは, 相手ピアが出力ストリームをcloseした場合(上記)と同じ(writeは無影響)--
入力をshutdownしたreadは正常に続行されるwriteは成功するが相手側は受信したデータを無視(UNIX), SocketException: connection reset by peerを投げる(Windows), 相手は受信データをバッファに入れるだけでアプリケーションに送らないのでwriteはやがてブロックする(Linux)※次のread/writeで左記の状態となる次のread/writeで左記の状態となる次のread/writeで左記の状態となる
ソケットもI/Oストリームもcloseせずにプログラムが突然終了した結果はcloseと同じであるべきだが、現実はプラットホーム依存: 何もしないと、readがタイムアウトするかまたはいつまでもブロックする; RSTを発行するとその後のwriteはSocketException: connection resetを投げる.
※:[出典]
※:付録B:表B.1 下から2つ目の項目(shutdownInput/write,writeXXX)を見てください(訳書p364)。結局のところ、この問題に限らず、良質なネットワークアプリケーションは、TCPレベルで何が起きるかよりも、アプリケーションプロトコルの設計に依存する部分が大きいと言えます。