重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (2件)

WSAStartup()およびWSACleanup()は、プログラム中で1度呼び出せばOKです。



最初は上手く動くが、途中でこの状況に陥るということですか?
まず、クライアントかサーバのどちらで異常が発生しているのかを突き止めなければなりません。

クライアント側
・正しくclosesocketが行えているか?
・connect時にどんなエラーが帰っているのか?
 WSAGetLastErrorで調べる

サーバ側
・正しくclosesocketが行えているか?
・子プロセスは正常終了しているか?
 recvあたりでブロッキングされていないか。

http://www.usay.jp/
このサイトに、Socketerという通信エミュレートソフトがあります。
これを使ってサーバ、クライアントをエミュレートしてみてください。

また、エラーが発生していそうな部分で、WSAGetLastErrorを使ってエラーコードを取得してみてください。

参考URL:Winsock Error Code

参考URL:http://homepage1.nifty.com/yito/anhttpd/winsock_ …
    • good
    • 0

あまり自身はないのですが、向学のために回答させていただきます。


サーバー側のsocket Closeの記載がありませんが、子プロセス
が終了のたびにCloseしているかどうかが少し気になります。

この回答への補足

回答ありがとうございます。
記載するのを忘れました。サーバ側は、子プロセス終了する度にcloseを行っております。

補足日時:2006/09/14 00:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!