ソケット通信を利用したサーバープログラムを作成しています。
別のサーバープログラムと接続している既存のクライアントシステム(PCではなく専用のハードウェアで動いています)と繋げるものになるのですが、
クライアントが切断した時のサーバー側の挙動で困っている部分があり、ご教示いただきたいです。
各パターンにおける別のサーバの挙動を下記に示します。
①クライアントの電源を落とした場合
即座にサーバー側がソケットの接続をクローズする
電源を付け直して再接続
②クライアントのLANケーブルを抜き差しした場合
LANケーブルを抜いている間はソケットの接続がクローズされず、
LANケーブルを接続しネットワーク認識後にソケットをクローズし、再度接続しなおす。
特に①の部分の仕組みが再現できません。
クライアント側が電源を落としたときにクローズを行っているように感じるのですが、
そもそもクラアイント側がクローズした際にはサーバー側に何か通知のようなものは送られるのでしょうか?
(確認方法はSocketのConnectedだけ?)
下記のようなコードで確認してみたのですが、
電源が落ちているせいか「ClientSocket.Connected == false」の部分が引っかからないようです。
実現方法をお教えいただければ幸いです。
※追記
とりあえずご指定のように接続チェックの前に0バイトのSend呼び出しを行ってみましたが、
クライアント側の電源を落とした後でもConnectedでfalse判定がされません。
ブロック状態で止まっている様子はないのですが・・。
rivate void ThreadMethod(object state) { // クライアントのソケット System.Net.Sockets.Socket ClientSocket = (System.Net.Sockets.Socket)state; int try { while (Form1.SLTAlive) { Thread.Sleep(1); byte[] tmp = new byte[1]; ClientSocket.Blocking = false; ClientSocket.Send(tmp, 0, 0); ClientSocket.Blocking = true; Console.WriteLine(cnt); //ソケットが接続断またはnullになっていた場合、スレッドを終了させる if (ClientSocket.Connected == false || ClientSocket == null) { //クライアントと切断されました ClientSocket.Shutdown(SocketShutdown.Both); ClientSocket.Close(); ClientSocket = null; break; } //略 } } }
private void ThreadMethod(object state) { // クライアントのソケット System.Net.Sockets.Socket ClientSocket = (System.Net.Sockets.Socket)state; try { while (Form1.SLTAlive) { Thread.Sleep(1); //ソケットが接続断またはnullになっていた場合、スレッドを終了させる if (ClientSocket.Connected == false || ClientSocket == null) { //クライアントと切断されました ClientSocket.Shutdown(SocketShutdown.Both); ClientSocket.Close(); ClientSocket = null; break; } //略 } } }

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/08 05:40
2016/07/08 06:37 編集