C#の質問なので場違いかもしれませんが…
今、TcpClientクラスとTcpListenerクラスを使用した通信クラスを作成しています。
そこで質問なのですが、クライアントPCがなんらかのアクシデント(例えば停電など)で正規の手続きを踏まずにPC自体の電源が切られて強制的にアプリケーションが終了した場合に、サーバー側からそれを知る事というのは出来るのでしょうか?
通常の強制終了は例外が発生するので、それを拾えば処理できるのですが、こういうイレギュラーな強制終了の場合には例外が発生しないので困っております。もし、ご存知の方がいらっしゃったら、是非ご教授願えないでしょうか?
やはりSocketクラスを使用するしかないのでしょうか…
C#のネットワークプログラムについて
Re:C#のネットワークプログラムについて
ネットワークに詳しくないので参考になりそうなリンクだけ張っておきます。
http://yanesdkdotnet.sourceforge.jp/wik ... dk.Network
「切断検知のメカニズムについて」
グーグルでの検索キーワード
「ネットワーク クライアント 例外 切断」
http://yanesdkdotnet.sourceforge.jp/wik ... dk.Network
「切断検知のメカニズムについて」
グーグルでの検索キーワード
「ネットワーク クライアント 例外 切断」
Re:C#のネットワークプログラムについて
返信ありがとうございます。一応、気になるキーワードでググってみてはいるので、紹介いただいたページもブックマーク済だったりします(^_^;)
ただ、私の質問は切断検知のアルゴリズムではなくて、前述のクラスに切断検知を行なう機能があるかどうか…だったんですよね…
ただ、私の質問は切断検知のアルゴリズムではなくて、前述のクラスに切断検知を行なう機能があるかどうか…だったんですよね…
Re:C#のネットワークプログラムについて
>前述のクラスに切断検知を行なう機能があるかどうか
無いと思います。
クライアントの電源が切られたら、通信して知らせる暇無く落ちます。
UPSがあれば別ですが。
>サーバー側からそれを知る事というのは出来るのでしょうか?
クライアントが次に起動したときに、ならなんとかなるんじゃないでしょうか。
起動時に何かしておいて、正常な終了時に元に戻す。
起動したときに、元に戻っていなかったら前回異常終了した、とクライアントが判定して
サーバーにその情報を送る、とか。
次に起動したときでは遅い、できるだけ早く知りたい、のであれば
・ 一定間隔おきに通信を行って、正常な終了時の信号なしに突然途切れたら
(ネットワーク異常だとか別の要因だとしても)サーバー側で異常終了したと判定する。
・ マシンをもう一台用意して、対象のクライアントの状態を監視する
(その別のマシンが電源の状態も監視できるとベスト)
とかはどうでしょうか。
無いと思います。
クライアントの電源が切られたら、通信して知らせる暇無く落ちます。
UPSがあれば別ですが。
>サーバー側からそれを知る事というのは出来るのでしょうか?
クライアントが次に起動したときに、ならなんとかなるんじゃないでしょうか。
起動時に何かしておいて、正常な終了時に元に戻す。
起動したときに、元に戻っていなかったら前回異常終了した、とクライアントが判定して
サーバーにその情報を送る、とか。
次に起動したときでは遅い、できるだけ早く知りたい、のであれば
・ 一定間隔おきに通信を行って、正常な終了時の信号なしに突然途切れたら
(ネットワーク異常だとか別の要因だとしても)サーバー側で異常終了したと判定する。
・ マシンをもう一台用意して、対象のクライアントの状態を監視する
(その別のマシンが電源の状態も監視できるとベスト)
とかはどうでしょうか。
Re:C#のネットワークプログラムについて
返信ありがとうございます。
やはり、基本はハンドシェイクさせないと駄目なんですね。ただ、ポーリングさせるのはCPUに掛かる負担が大きくなってしまうので、極力避けたいんですよね…。
となると、クライアント側の正常終了時に情報を更新させるという処理がよさそうですね。実際、異常切断状態を検知するよりも、異常切断から復旧させる手段を知りたかったものでして…非常に助かりました。
正直、この発想は思い付かなかったので、目から鱗でした。
やはり、基本はハンドシェイクさせないと駄目なんですね。ただ、ポーリングさせるのはCPUに掛かる負担が大きくなってしまうので、極力避けたいんですよね…。
となると、クライアント側の正常終了時に情報を更新させるという処理がよさそうですね。実際、異常切断状態を検知するよりも、異常切断から復旧させる手段を知りたかったものでして…非常に助かりました。
正直、この発想は思い付かなかったので、目から鱗でした。