• 締切済み

ソケット通信異常

クライアントがソケットを接続した状態でサーバープロセスがいきなりDownした場合、クライアント側でlisten()から抜けてきません。 OSのパッチ等あるのでしょうか?

みんなの回答

  • fofof
  • ベストアンサー率88% (8/9)
回答No.2

大変申し訳ないのですが、やはり状況が良くわかりません。 > さて、問題のプロセスですが。プロセス(A)からプロセス(B)に対してデータを逐次送信しています。 データの送受信方向ではなく、listen と、connect がどのような分担になっているかを明確にされたほうが良いと思います。データ自体はどちらからどちらにでも送れますので。 それから、前提として、(A) (B) は、それぞれ違うマシンで動いており、ネットワークを介して通信を行っているということですよね? > プロセス(B)はプロセス(A)に対して接続処理を実施し、 (A) が listen していて、(B) が connect しにいっているのですね? > 接続後は口を空けてデータを待っており、プロセス(A)がダウンしたのを認識するとプロセス(B)がプロセス(A)と再接続を実施します。 口をあけてデータを待っているというのは、listen しているという意味じゃなくって、recv しているという意味でしょうか。 そして、(A)がダウンした場合に、(B) から再接続(connect)に行く? > ここで、プロセス(A)の存在するサーバー(Solaris)が異常停止(CPUパニック等)した場合に (A) が動いているマシンが、停止してしまった、もしくは、プロセス(A)が落ちたということでしょうか。 > プロセス(B)がプロセス(A)のダウンを検知できず、 > 存在するサーバー(Solaris)でnetstatコマンドで確認すると接続が残っているんです。 > プロセス(B)の問題か、OSの問題かを切り分けたいのですが・・・ (B) が動いているマシンで、netstat を行ったということですかね? そうだとすると、(B) は、listen を行っていないので、最初の質問と状況が合わないのですが… それとも、connect した socket が残って見えるということでしょうか。 それとも、listen から抜けてこないといっているので… うーん。 ともかく、以下のどれかあたりの問題ではないかと思います。 ソケットが閉じるのの検出 http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.1 ソケットの閉じかた http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.5 双方向通信などで複数プロセス使った場合のデッドロック回避とか http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.6 通信相手の死亡の検出関係 http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.8 相手が死んでいる際にコネクトでブロック http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-3.html#ss3.5 他のパターンでも、このFAQをよく読むと解決するんじゃないでしょうか。

参考URL:
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

質問の意味がよく判らないのですが、 listenを行うのは、サーバプロセスではないでしょうか。 通上、TCP/IP上の、サーバープロセスとは、listenを行うプロセスであり、クライアントプロセスとは、listenしているポートに対して接続を行うプロセスを示します。それとも、別な意味で、サーバプロセス及びクライアントプロセスを定義しているのでしょうか。 あなたが、いっているサーバプロセス、クライアントプロセスとは、どのようなプロセスなのでしょうか?

mo_aries
質問者

補足

返事が遅くなり申し訳御座いません。 サーバーとクライアントで混乱をまねいてしまい、なんと言って良いやら・・・ さて、問題のプロセスですが。プロセス(A)からプロセス(B)に対してデータを逐次送信しています。 プロセス(B)はプロセス(A)に対して接続処理を実施し、接続後は口を空けてデータを待っており、プロセス(A)がダウンしたのを認識するとプロセス(B)がプロセス(A)と再接続を実施します。 ここで、プロセス(A)の存在するサーバー(Solaris)が異常停止(CPUパニック等)した場合にプロセス(B)がプロセス(A)のダウンを検知できず、存在するサーバー(Solaris)でnetstatコマンドで確認すると接続が残っているんです。プロセス(B)の問題か、OSの問題かを切り分けたいのですが・・・

関連するQ&A

  • ソケット通信について

    VC++6.0MFCでソケット通信のプログラムを作成しようとしています。勉強始めたばかりなので、やっと普通に通信するプログラムは理解できたところです。 そこで応用していろいろ考えているのですが、方法がわからないところがありますので教えていただければと思ってます。 サーバ側の接続待ちはいつでも受けれるようにして、接続してきたクライアントに対して送信したいと考えております。ソケットの接続情報を保持しておいて、別プロセスの送信プログラムが接続クライアントに対して送信したいと考えてます。その送信プログラムが複数ある場合も同じ接続情報を利用したいと考えてるのですが、可能でしょうか。 説明が下手で申し訳ありません。補足はいたしますので、アドバイスお願いいたします。

  • ソケット通信におけるデータ送信手法

    ソケット通信ができるサーバプログラムをPHPにて組んでいますが、疑問があります。 Server/Clientの形で、PHPでくんだServer側はListenして通信を待っているのですが、仮に、サーバ側から任意のタイミングで通信を発生させることは可能なのでしょうか。 これが1点です。 あと、1つのサーバプログラムに対して、複数のクライアントが接続するようなパターンは作成可能なのでしょうか。 暗中模索のため、難儀しています。 ご教示いただければ幸いです。

    • ベストアンサー
    • PHP
  • C#でソケット通信

    初歩的な質問ですみません。 クラアント側とサーバー側にそれぞれC#で作ったプログラムをインストールし、 クライアントからサーバーにデータを繰り返し送信したいとき、 そのプログラム内でソケット接続して送ることはできるでしょうか? できるとして、どのような手順でソケット接続し、データを送ればいいのでしょうか? まったくの初心者です。 よろしくお願いします。

  • ソケット通信

    現在プロセス間通信について学んでおり、 今はソケットを使ったプロセス間通信のプログラムを書いています。 そのソケット通信での質問なのですが、 2台のパソコンでINETドメインのソケットを使って プログラムを書いているのですが、 サーバーを実行した後、 別のパソコンでサーバー側のパソコンのIPアドレスを指定して クライアントを実行しようとすると、 connect:Connection timedout と表示されて実行できません。 同じプログラムをUNIXドメインで 1台のパソコンで実行すると正しく実行できます。 これは、プログラムに問題があるのでしょうか? それとも、ソケット通信を行う際には 何かパソコン等の設定が必要なのでしょうか? 教えてください。お願いします。 あと、セマフォを用いたプロセス間通信のサンプルプログラムが のっているホームページなどご存知でしたら、 教えていただけるとありがたいです。

  • vb2010でソケット通信を使いたいのですが

    はじめまして。 vb2010でソケット通信を使いたくて、今TCPサーバーを作っています。 クライアント側から受信した瞬間にサーバー側から返信というのは可能でしょうか。 受信したタイミングで接続が切れてしまって困っています。 初めてソケット通信に触れてイマイチ分かってないので説明がうまくいきませんが、 どなたかわかる方がいらっしゃいましたらご回答よろしくお願いします。

  • 異なる言語間でのソケット通信について

    簡単なネットワークプログラムを作成して、ソケット通信の確認をしています。 クライアントとサーバが両方ともにC++の場合と、両方ともにJavaの場合で、正常に通信が行われていることは確認しました。 そこで、クライアントでC++のプログラムを動かし、サーバでJavaのプログラムを動かしてみたのですが、うまくいきませんでした。 (ポート番号を合わせたので、相互接続は出来てるみたいですが、データが渡ってきませんでした。OSはクライアント/サーバともに、Windowsです。) 言語が異なる場合の、ソケット通信について良いサイトをご存知でしたら、教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • ソケット通信で接続クライアントの上限を設ける

    (Unix c言語) ソケット通信で、サーバに接続するクラインとの上限をきめてそれ以上の数の接続要求があった場合、そのクライアントに対しての接続を拒否するには、サーバ側とクライアント側でどのような書き方をすればいいでしょうか?

  • ソケット通信処理について

    現在、下記のようなクライアント、サーバ通信を行っております。 [クライアント] (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)上記の作りで考えられる要因として、何があるか ご教示して頂きたく、宜しくお願い致します。

  • ソケット通信での再接続

    ソケット通信での再接続 ソケット通信でサーバ側は立ち上げたまま、 クライアント側を同じポート番号で 何度も再接続できるようにしたいと考えております。 http://blog.livedoor.jp/akf0/archives/51585502.html を参考にマルチスレッドを利用してプログラムを作成してみましたが 最初の起動に関してはうまくいくのですが、 クライアント側を一度終了してもう一度再接続すると、 バインドエラーが出ます。 いろいろ試してみたのですが、 どうしてもうまくいきません。 どうすればいいのでしょうか。 ご存じの方がいらっしゃればお答えいただきたいと思っております。 よろしくお願いいたします。 環境 OS:Windows XP 開発環境:Visual Studio 2008 Express Edition ソケット通信:winsock2 マルチスレッド:win32api

  • 【ソケット通信】TIME_WAITを0にする方法

    【現状】 VC#でソケット通信のソフトを作成しています。 【問題】 クライアント―サーバ型のソケット通信をしようとしているのですが、切断後すぐに再接続できないという問題が生じております。 【調査結果】 調べたところ、TCP/IPの状態遷移でアクティブクローズ側がTIME_WAIT状態になることが分かっています。TIME_WAITの設定値には意味合いがあり、漂流中の重複パケットの問題を回避するためや最後のACK再送のためであることは理解しております。 【やりたいこと】 今回は基本的に1:1通信でルータを挟まずにやりとりするネットワークなので、TIME_WAITを0、もしくは数msecにしたいと考えています。 ※ 同じIPアドレス、ポート番号で接続したい為(ポート固定での再接続) 【自分で出した解決案の一つ】 どうもサーバ(Listenする側)からアクティブクローズすると、TIME_WAITは生じるもののクライアントから接続要求を出すと同じポートからでももう一度接続できてしまうというのは判明したので、必ずサーバから切断要求を出す仕様にすればTIME_WAITが0になるように思われます。 ただし、なぜ再接続できるのかは不明のため、すっきりしない(&環境や設定が異なると再接続できない可能性あり) 【質問】 (1) クライアント側からアクティブクローズする場合に、TIME_WAIT状態を1秒未満に設定する方法はありますか?(VC#で) (2) サーバからアクティブクローズした場合に、なぜ再接続できてしまうのでしょうか? 以上の2点の質問に、どうかご回答のほどよろしくお願いいたします。