質問: すいません,業務のソフトを作成していて解決できない点を質問させていただきます.なので,説明できない点はご了承お願いいたします. 【実現したいこと】 シミュレータが送信する情報をクライアントPCが受信して画面表示する.クライアントPCが受信した情報は,また別のクライアントPCに送信して画面表示する.接続構成図は【試験環境】の改修後に記載している形です. 【仕様(抜粋)】 1.クライアントPC兼サーバPCがシミュレータと接続異常になるとブザーが鳴動する. 2.クライアントPC2とクライアントPC3は,クライアントPC兼サーバPCと接続異常になるとブザーが鳴動する. 【現在の状況】 PC4台をHUMB経由で【試験環境】の改修後のように接続して,「試験方法」のように各PCを起動する.その後,エージングしていると,6つ起動しているシミュレータの1つのソケットが突然,切断されてしまいます.そのためなのか,クライアントPC2やクライアントPC3で接続異常になり,ブザーが鳴動します.本来ならば,シミュレータとクライアント兼サーバPCの接続が異常になったので,クライアント兼サーバPCのブザーが鳴動するはずなのですがブザーが鳴動しません.なぜでしょうか? 改修前の試験環境でシミュレータを1つでも終了すると画面表示側のクライアントPCは接続異常を判断して,ブザーを判断しました.ですが,クライアントPC2とクライアントPC3に情報を送信するサーバ機能を追加したところ,シミュレータとクライアントPC兼サーバPCが接続異常でもブザーが鳴動しないのは,追加したサーバ機能のせいと思ったほうがよいでしょうか? ご教授お願いいたします. 「試験方法」 1.サーバPCの電源を入れた後,シミュレータを6個起動. 2.クライアント兼サーバPCの電源を入れる(電源を入れると,アプリが勝手に立ち上がる). 3.クライアントPC2台の電源を入れる(電源を入れると,アプリが勝手に立ち上がる). 【試験環境】 改修前:サーバPC(シミュレータ6個起動)-----クライアントPC 改修後:サーバPC(シミュレータ6個起動)-----クライアントPC兼サーバPC-----クライアントPC2 |--クライアントPC3 【各装置のフロー制御】 ソースコードを全て覚えていないので簡単なフローを記載します. 「クライアントPC兼サーバPCの受信側(A.exe)」 1.各シミュレータ装置分だけスレッドを生成する. 2.スレッド内で下記3~7を実行する. 3.socketでシミュレータとソケットを生成する. 4.selectで指定時間,各ソケットを監視. 5.connectでシミュレータのソケットと接続. 6.シミュレータから送信される情報をrecvで受信. 7.受信した情報の整合性を判定して正常の場合,受信情報を画面表示. 「クライアントPC兼サーバPCの送信側(Server.exe)」 1.各クライアントPCに対してスレッドを生成する. 2.スレッド内で下記を実行する. 3.socketでクライアントPCとソケットを生成する. 4.bindでIPアドレスとポートをソケットにバインド 5.listenで接続準備. 6.acceptで接続受信待ち. 7.selectで指定時間,ソケットを監視. 8.for文で6回,シミュレータから受信した情報を送信する(send). 「クライアントPCの受信側(Client.exe)」 1.各サーバPCに対してスレッドを生成する. 2.スレッド内で下記3~7を実行する. 3.socketでシミュレータとソケットを生成する. 4.selectで指定時間,ソケットを監視. 5.connectでシミュレータのソケットと接続. 6.サーバPCから送信される情報をrecvで受信. 7.受信した情報の整合性を判定して正常の場合,受信情報を画面表示. 【試したこと】 1.各装置のソケット状況を「netstat -abop tcp」で確認したところ,最初はシミュレータ6個分のソケットがESTABLISHEDなのですが,突然ソケットが切れた後,再び確認してみると,シミュレータがLISTENING,クライアントPCがSYN_SENTで,ソケットの接続待ちと要求はしていることは確認しました.なのですが,赤●(接続異常)になったシミュレータが接続正常にならない. 2.クライアントPC2とクライアントPC3でブザーが鳴動した時にソケット状況を「netstat -abop tcp」で確認したところ,SYN_SENTでクライアントPC兼サーバpcがLISTENINGでソケットの接続待ちと要求はしていることは確認しました. 【各装置の補足情報】 ・シミュレータ(機能):画面表示PC(クライアントPC)に画面情報を送信する.画面表示PCからはアンサー情報を受信する.画面情報の送信およびアンサー情報の受信が成功の場合,シミュレータ画面上に接続成功を示す緑●(接続成功),画面情報の送信またはアンサー情報の受信が失敗の場合,赤●(接続失敗)を表示する. ・クライアントPC兼サーバPC(機能):シミュレータから情報を受信し画面表示する.受信した情報が正常ならば,アンサー情報をシミュレータに送信する.シミュレータから情報を受信している間,クライアントPCにシミュレータから受信した情報を送信する. ・クライアントPC(機能):クライアントPC兼サーバPC(機能)が送信する情報を受信して,受信情報が正常ならば画面表示する. クライアントPC兼サーバPCとクライアントPCは,同じソフトで,iniファイルで起動するタスクを分けています.タスクは全部で4つ(Main.exeとA.exe,Server.exe,Client.exe)あり,クライアントPC兼サーバPCのときは,Main.exe(画面表示用)とA.exe(シミュレータからの受信用),Server.exe(クライアントPCに送信用)が起動する.クライアントPCのときはMain.exe(画面表示用)とClient.exe(クライアントPC兼サーバPCからの受信用)が起動します. 【開発環境】 OS:Windows7 32bit IDE:C++ Builder6
回答: データ送信でまともなフロー制御は行われていますか? 例えば、クライアントPC3の処理が重くなって暫くデータを受信できなくなったら、前段のPCで送信データは正しくブロック(及びバッファリング)されますか? そうで無ければ多段での運用は無理です。