• ベストアンサー

受信処理の終了条件

TCP通信でデータを送受信してスループットを測定するプログラムを作成しました。 1.ホストAがデータを送信し,ホストBがそれを受信し、スループットを計算する. 2.ホストBがデータを送信し,ホストAがそれを受信し,スループットを計算する. 3.ホストAがホストBにfinishという文字列を送信する. 4.ホストBがホストAにfinish_recvを送信する. 5.プログラムを終了する. 1と2を行った後,測定終了しましたという意味のfinishをホストAからホストBに送信させます。 ホストAの動作が何らかのアクシデントで2.の途中、つまり受信処理中に止まってしまった場合, ホストBはfinishを受信するためにずっと受信状態で待つことになるとおもうのですが, ホストAは止まっているので,finishが受信されずに永遠に受信待機になると思います. このように何らかのアクシデントで受信処理が終わらなくなった場合、受信しなくても 強制的に受信処理を終わらせることはできますか? 私が考えたのは時間内にデータが送信されてこなかったら強制的に受信を止めさせるというものです. なにかよい方法はありませんか?アドバイスをしていただきたいです.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

強制的に受信処理を終わらせることはできます。Socketをshutdownあるいはcloseすれば強制的に受信処理を終わらせられます。 また、debukawaさんが考えておられる通り、一定時間待っても通信がなされなかったら何らかのアクシデントのために通信できなくなったと判断して通信を切断するというのが一般的だと思います。SMTPなどインターネット上で使われている主要なプロトコル(約束事)にもどれくらいの時間待たなければならないかが明記されているほどです。この待ち時間のことをタイムアウト時間と言います。 Javaでタイムアウトを使うには、SocketクラスにあるsetSoTimeoutメソッドでタイムアウト時間は設定します。設定したあと受信(read)中にタイムアウトが発生すると、java.net.SocketTimeoutExceptionが発生しますのでそれをcatchすれば一定時間受信がなかったことがわかります。なお、setSoTimeoutをしていないとそのプログラムはデータがくるまで待ち続けます。(マルチスレッドだとデータを待っているスレッドだけが止まりますが...)

debukawa
質問者

お礼

hanabutako様,回答ありがとうございます. 参考にさせていただきます.

関連するQ&A