- 締切済み
ソケット通信異常
クライアントがソケットを接続した状態でサーバープロセスがいきなりDownした場合、クライアント側でlisten()から抜けてきません。 OSのパッチ等あるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- fofof
- ベストアンサー率88% (8/9)
大変申し訳ないのですが、やはり状況が良くわかりません。 > さて、問題のプロセスですが。プロセス(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をよく読むと解決するんじゃないでしょうか。
- tatsu99
- ベストアンサー率52% (391/751)
質問の意味がよく判らないのですが、 listenを行うのは、サーバプロセスではないでしょうか。 通上、TCP/IP上の、サーバープロセスとは、listenを行うプロセスであり、クライアントプロセスとは、listenしているポートに対して接続を行うプロセスを示します。それとも、別な意味で、サーバプロセス及びクライアントプロセスを定義しているのでしょうか。 あなたが、いっているサーバプロセス、クライアントプロセスとは、どのようなプロセスなのでしょうか?
補足
返事が遅くなり申し訳御座いません。 サーバーとクライアントで混乱をまねいてしまい、なんと言って良いやら・・・ さて、問題のプロセスですが。プロセス(A)からプロセス(B)に対してデータを逐次送信しています。 プロセス(B)はプロセス(A)に対して接続処理を実施し、接続後は口を空けてデータを待っており、プロセス(A)がダウンしたのを認識するとプロセス(B)がプロセス(A)と再接続を実施します。 ここで、プロセス(A)の存在するサーバー(Solaris)が異常停止(CPUパニック等)した場合にプロセス(B)がプロセス(A)のダウンを検知できず、存在するサーバー(Solaris)でnetstatコマンドで確認すると接続が残っているんです。プロセス(B)の問題か、OSの問題かを切り分けたいのですが・・・