質問者
NetworkStream作成後の切断

質問
-
通信していて、片方が何らかの形で通信を切断してしまった場合、もう片方がNetworkStreamをReadしようとすると例外が発生すると思います。
そうならないように、Readする前に相手が正常に通信しているか確認するには
CanReadで確認するということなのでしょうか?
どうも組んでいて、自信が無いので皆さんに聞いてみました。
それとも、別の方法があるのでしょうか?
ネット検索したり、手元にある「Visual C#.netではじめる TCPネットワークプログラミング」(これはとてもわかりやすいです)を読んでもやり方がわからなかったので、ご存知の方教えていただければ幸いです。
すべての返信
-
ネットワークを扱う処理は通信相手の予期せぬ事態に対しての対応がとても難しいと感じています。
いやいやいや。予期せぬ事態に対して対応するのが例外処理です。
例外が発生したら止まるわけではありません。発生した例外に対し適切な処理を行わなかった場合に、最終的にランタイムが実行不能とみなして強制的に終了させるだけです。
try-catch を使って、発生する例外に対して適切に対処してください。自身では処理できない例外まで捕まえちゃいけませんが。
canReadは通信相手がメッセージなり何なりデータを送信してきたときにはtrue
いいえ、違います。そのストリームが読み取り操作をサポートしているかどうかを表すだけです。例えば書き込みモードで開いた FileStream の場合 CanRead は False を返します。
TCP 接続を元に作った NetworkStream なら CanRead/CanWrite はともに True を返すでしょう。
-
ありがとうございます。
正常にCloseするとreadは0を返し、文字列が入力された場合は、送信されてきた文字のbyte数を返しますね。
ただ、やってて疑問なのは空の文字列を送信した場合は、
readは何も反応しないのです。これはこれでこういうものなんでしょうか。
それか、そもそも空だと送信側が送る処理をしていないのかとも頭をよぎりました。
特に問題があるというわけではないのですが、違和感を感じてしまいました。
それか、空の文字列を送信してreadが0を返すと切断判定ができないから
わざとそういった仕様にしているのかなとも思いました。以上余談です。