• ベストアンサー

Socket通信での通信異常について

JavaでSocket通信している状態で、物理LANを抜いたりして通信異常状態を起こしても、すぐには通信異常と検知できないようで、一定期間してからSocketExceptionなどを検知します。 現在、クライアントとサーバで常に受信し続け、各々で1秒毎にSocketでメッセージを相互に送っております。 その間で物理LANを抜いても、一定期間は送信しつづけるように見え(実際受信はされていない)、 一定時間を超えると、上記のようにSocketExceptionで例外検知します。 上記のようにSocket通信で通信異常状態の場合には即検知することは無理なのでしょうか?

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

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

はい。 通信経路全体をなにか特別な装置で監視するような仕組みでも あれば話は別ですが、普通は、通信経路のどこかのLANケーブルが 抜けたからといってすぐにはSocketExceptionは検出されません。 通信経路は、一時的なパケットの紛失が発生する前提で作られて おり、TCPプロトコルの中には紛失したパケットを再送する機能が あります。これにより、一時的にLANケーブルが抜けても、 すぐにつなぎ直せば何事もなかったかのように、通信が継続できる メリットがあります。簡単には障害にしないよう頑張っているということです。 つまり、この再送タイムアウトが発生するまで障害検出されません。 この時間を短くすることは、 http://support.microsoft.com/kb/170359/ja のように設定変更で可能ですが、他のアプリケーションにも 影響しますので、アプリケーションの都合で変更するのは お勧めしません。(これはネットワーク環境に応じて変更するものです) 自分のアプリケーションの都合で早めに障害検出をしたい場合は、 1秒毎にSocketでメッセージを相互に送っているとのことですから、 そのメッセージを一定時間以内に受信しなかったら障害とするよう、 自分が必要とする時間でパケットの受信をタイマ監視する処理を 追加すればよいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • socketについて

    こんにちわ ソケットプログラムで質問なのですが ソケット作成(listen状態)後selectで通信を待っています。 その後selectを抜けて(通信がきたはず?)その直後にあるacceptでプログラムがとまってしまいます。 selectでは上記で作成したソケットしか感知しないようになっています。 これはselectを抜けてacceptにいくまでに通信が切れてしまったのでしょうか? socket~bind~listen~select~accept               ↑このタイミングで通信が切れたのでしょうか?

  • socket通信、マルチキャストについて

    socket通信の勉強中です。 http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/multicast.html 上記のサイトを参考に、マルチキャスト通信を試しています。 LAN内では、正常に通信できています。 ここで疑問なんですが、マルチキャストのアドレスは、 適当に決めてしまっていますが(224.1.1.1で試しています) これはイントラネットでの利用が前提なのでしょうか? それとも、インターネット上でも利用できるのでしょうか? 勝手に決めたアドレスでは、重複する可能性があると思うのですが・・・ しかし、マルチキャストの使用例として、インターネット会議や、 インターネット放送が挙げられているところを見ると、 インターネットでも利用できそうな印象を受けます。 利用できる場合、アドレスをどのように決めているのでしょうか? ご存知の方いらっしゃいましたら、よろしくお願いします。

  • 車の異常!!教えて!!

    N社のウ○ング○ード車(CVT)、2006年12月購入に乗っています。走行距離は1万キロ弱です。 昨日、車を運転していたら、坂道で、一時停止してさらに坂を上ろうとしていましたが、アクセルを踏んでも加速していかず、エンジンがうなってしまいました。 とりあえず、いったん停止してパーキングにしてから車を一周して異常が無いので、また足り出しましたが、同じ症状で、加速しません。 ディーラーに電話して来てもらいました。その間バックギアにして、平らなところまで進み、とめて待つことにしました。その間アイドリング状態でパーキング状態で約40分まってました。 バックギアに入れても同じ症状で、再度試しにDギアで前進してみましたが同じ症状でした。 ディーラーでは、コンピューターを使い、検査したけど何も異常が上がってないので、明日メーカーに連絡して回答すると言っていた。 本日、ディーラーからメーカーに状態を確認してもらいましたが、車速検知器が異常ではないかと、思われるとの事、ディーラーは、明日、部品が届き次第交換すると連絡受けました。 (エンジン回転数制御の検知器と車速検知器のマッチングが狂った、加速検知器の信号が瞬時停止したので、異常信号も出なかった。) 私は、現状で、車速検知器の信号線を片側でもはずせば、異常信号が出て、その状態で再接続して、車を走らせると同じ状態になるんだと思いました。また、車速検知器を取り外し単品で検査し、異常がありますと確認できれば、車速検知器を交換すればいいかなとも思いました。 上記検査しても異常が無いなら、他のどこかに異常があるのではないかなと思っています。 CVTは車速検知器が上記の場合又は、配線切れした場合に、Dギアで走行するとどのギアに入ってるんだろう?、 異常があった時に加速しないで進んだ(ノッキングもなし)のは、どのギアに入ってたんだろう? 疑問ばかりです。 メカニック系の方や車に詳しい方、何か言い方法ありますか? 又、こんな症状聞いたことありませんか? 大変困っていますので、至急回答をよろしくお願い致します。

  • Android Socket.connectエラー

    Androidでソケット通信するプログラムを作っています。 PC側がソケットサーバーをたてて(accept)、 Android側でクライアントとして接続(connect)するようにしています。 connectを実行している部分のソースは以下のようにしています。 ----------------- String ip = "192.168.XX.XX"; <-PCのIPアドレス int port = 9999; socket = new Socket(); InetSocketAddress addr = new InetSocketAddress(ip, port); try{ socket.connect(addr); return true; }catch(IOException e){ e.printStackTrace(); return false; } ------------------ 上記やり方でまずはエミュレータで試したところうまく行きました、その後 実機に入れて同じように実行したところconnectのところで例外が飛んできます。 メッセージは"no route to host"でした。 実は全く同じソースで以前は実機でもできていたはずなんですが、 最近試したところできなくなっているようでした。 Android端末はXperia Arcですが、OSを2.3.4にバージョンアップしたことくらいで 以前と特に変わったところはないと思うのですが 原因として何が考えられるでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Java
  • Socketの使用方法について

    Socketの使用方法について サーバ側クラスA クライアント側クラスB とあり、Aは常駐しておりBから接続が合った場合に処理を行い、 処理後には待機状態に再び戻ります。 上記の場合に Aのクラスは以下のように作成しましたが、★の部分でCloseではなく、このままこのソケットを使用して待機したいです。 (ほぼ同時刻に複数のアクセスがあるため、資源の事を考えて使いまわしたいです。) どのような手段があるのかご指導お願い致します。 又、そもそもソケットに関しての理解が足りないとも思いますので、参考サイトを教えていただけると幸いです。 クラスA ServerSocket svsock = new ServerSocket(port); while (true) { Socket socket = svsock.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter out = new BufferedWriter(new PrintWriter(socket.getOutputStream(), true)); // 処理結果を受信 String line; if ((line = in.readLine()) != null) { System.out.println("受け取ったメッセージ : " + line); out.write("サーバで表示。"); out.newLine(); out.flush(); } socket.close(); // ★ }

    • ベストアンサー
    • Java
  • SocketのSend関数でのCLOSEの検知 [Linux]

    Linux環境でSocket(dm:PF_INET,type:SOCK_STREAM)を使用しての、 Client&ServerプログラムをCで作成しているのですが、 そこでのSend関数の使い方についてご助力ください。 Client&Serverプログラムは下記のような動きをします。 [Client] ServerへConnectした後、複数のDataを数秒間隔でServerへ 送信(send関数使用)します。受信(recvやread関数等)は、 一切行いません。 [Server] ClientからのConnectを受け付けた後、Clientから受信(recv関数 使用)したDataを標準出力へ表示する。送信(sendやwrite関数 等)は、一切行いません。 さて、ここでもしClientプログラムがCloseを発行したり、マシン DOWN等の理由でConnectionが切断され、Server側のSocketが CLOSE_WAIT状態になった場合、Bufferに溜まっていたDataを すべて受けきった後、recv関数が0を返してくれるので 相手が終了したことがわかります。 ここからが質問のMainです。 では、もしServerプログラムがCloseを発行したり、マシン DOWN等の理由でConnectionが切断され、Client側のSocketが CLOSE_WAIT状態になっても、CLOSE_WAIT直後のsend関数が なぜか正常に処理されてしまいます。無論このDataは、 Server側は受け取りません。この次のsend関数実行時に EPIPEが返ってくるので、ここでようやくSocketが切断された ことが判ります。 これを何とかCLOSE_WAIT状態になった直後から、send関数で 切断を検知できるようにできないでしょうか。 よろしくお願いします。 以上

  • Javaプログラム同士のプロセス間通信について

    Java初心者です。 デーモン化したJavaプログラムとJavaサーブレット間のプロセス間通信を 行いたいと思っていますがどのようにしたものか悩み中です。 ○デーモン化したJavaプログラムは、 1、あるポートからSocket通信でデータを受信し、受信したデータをDBに格納する 2、クライアントからの要求で1で保存したデータを加工して送信 ○サーブレットプログラムでは、 上記のデーモン化プログラムの設定等をブラウザ上から変更できるようにしたいと考えています。 設定とは、例えば受信したデータを全てDBに保存せずに ブラウザから条件を設定できてフィルターするような動作に変更できたり、 また、デーモン化プログラムの動作をブラウザ上から停止、開始できるようにしたいのです。 上記の様な構成の場合にプロセス間通信をする必要があると思いますが、 どの様なプロセス間通信を使えばいいのか悩んでいます。 ほんとうは上記の様な2つのプログラムを1つのプログラムで出来ればいいなぁ~と考えているのですが、、 実現方法が判りません。。 なにか名案はございませんでしょうか? わかりづらい説明でもうしわけございません。 参考になるかわかりませんが、イメージ図を、 <イメージ図> デ  data   開  data    ク ー --------> 発 -------->  ラ タ        中         イ 鯖        鯖         アント          ↑          |          |設定変更          |       管          └--------- 理                   者 よろしくおねがいします。

    • ベストアンサー
    • Java
  • 通信ボックスの点滅が消えません

    ■製品名を記入してください。 【   MFC-J5630CDW     】 ■どのようなことでお困りでしょうか?  相談したいこと、トラブルに至った経緯、試したこと、エラーなどを教えてください。 【上記の機種(昨年末購入)に、以前使用していたMFC-J855DNの通信ボックスを接続しています。FAXの受信はできています。が、2~3日前から「ファックスを受信しました。複合機の確認」のメッセージが点滅しっぱなしです。複合機では受信していないようです。通信ボックスの停止を押しても消えません。複合機でも受信の表示が出ません。複合機との電話回線をチェックしても異常なしと出ます。電源を入切しても消えません。この状況で、次のFAXが来たらと思うと心配です。                 】 ■お使いの環境について教えてください。 ・パソコンもしくはスマートフォンのOSは何ですか? (例)Windows10/8.1/7・MacOS・iOS・Android 【Windows10        】 ・どのように接続されていますか? (例)有線LAN・無線LAN・USBケーブル・bluetooth 【有線LAN        】 ・関連するソフト・アプリがあれば教えてください。 【        】 ・電話回線の種類は何ですか? (例)アナログ回線・ISND回線・ひかり回線・IP電話 【アナログ回線        】 ※OKWAVEより補足:「ブラザー製品」についての質問です。

  • ヤフーですが通信速度が異常に遅くなってしまいました 

    一月程前からの現象なんですが、ネットの表示速度が異常な程に遅くなっているんです。ちなみにプロバイダはヤフーです。 それまでは普通に表示出来ていたんですが、今は酷い時だと途中でフリーズのような感じになってしまってうんともすんとも動かなくなってしまう時があります。 一度ヤフーに問い合わせた所今までと表示速度の変化は見られないと言われました。しかし結果的に以前よりめちゃくちゃ遅いのは事実なんです。今有線LANで2台のパソコンを使用しているんですがもしかしてルーターまたはモデムの故障でこんな現象が起きているんではないかと考えたりもするんですがこれらの機器の故障で通信速度が遅くなったりするんでしょうか? パソコン本体の状態は以前と何ら変化ないんでこちらの故障というのはまず考えにくいです。 あまりにも遅すぎるんでそろそろ我慢の限界です>< いよいよならプロバイダを変えようかとも思っております。 何か要因になるようなことで思い当たる節がありましたらぜひアドバイスよろしくお願い致します。

    • ベストアンサー
    • ADSL
  • ソケット通信処理について

    現在、下記のようなクライアント、サーバ通信を行っております。 [クライアント] (a)WSAStartup (b)socket (c)connect (d)send(サーバへの要求送信) (e)recv(サーバからの応答受信) (f)shutdown (g)closesocket (1)プロセスは、常駐している (2)(a)は初回起動時1回のみ (3)通常(d)~(e)を周期的に行う (4)(e)にて一定時間経過した場合、5秒待ち6回リトライし、それでもだめな場合は、(f)(g)を実施後(b)から処理を行う。この後、WSACleanupを行っていない。プロセス終了(exit)もしていない。 [サーバ] (a)socket (b)bind (c)listen (d)accept (e)子プロセス生成 以下子プロセス処理 (f)select (g)recv(クライアントからの要求受信) (h)send(クライアントへの応答送信) (1)親プロセス((a)~(e)を行うプロセス)は常駐している。子プロセス起動後、(d)でconnect待ちとなる。(クライアント側からの再接続待ち) (2)子プロセスは、通常(f)~(h)の処理を行い、(f)又は(g)の異常時にexitする。 この処理で、クライアント処理(e)の一定時間経過後の再接続が正常に動作しない場合があります。 詳細情報を取得していませんが(現実的にすぐに詳細情報を取得することができない状況)(c)にて異常が発生していると思われます。 一度その状態になると二度と再接続できなくなり、マシン再起動(プロセス再起動)で復旧させることになります。 (実際は、マシン再起動後に再接続が正常になることを確認しています。(プロセス単体の再起動での確認はしていません。)) そこで質問ですが、 (1)再接続時、WSACleanupを行っていないが、問題ないか(処理の順番:(f)→(g)→(b)) (2)再接続前にプロセス終了(exit)していないが、問題ないか (3)上記の作りで考えられる要因として、何があるか ご教示して頂きたく、宜しくお願い致します。