質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.57%

TCP/IPでソケットが突然切断されてしまうのはなぜでしょうか?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,059

dem0nmichik0

score 32

すいません,業務のソフトを作成していて解決できない点を質問させていただきます.なので,説明できない点はご了承お願いいたします.

【実現したいこと】
シミュレータが送信する情報をクライアント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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2018/10/28 00:43 編集

    一般的なアドバイスとして:そもそもソースコード無しに回答できる人はいません。それよりも、まずはネットワーク的なトラブルシューテンィグを試みた方が良いのでは?パケットキャプチャツールを利用して解析した方がよさそうですね。

    キャンセル

  • dem0nmichik0

    2018/10/28 14:13

    yohhoy様,アドバイスありがとうございます.ネットワーク的なトラブルシューティングとはどういうことでしょうか?pingなどのことでしょうか?おっしゃるようにパケットキャプチャツール(例:ワイヤーシャーク)でパケットがシミュレータからクライアントPC兼サーバPCに届いているかは確認していなかったので,確認してみます.

    キャンセル

回答 2

checkベストアンサー

+1

クライアント兼サーバPCのブザーを鳴動させる条件を満たしてないのでしょう。
この条件が何なのか、どうして満たしていないのかは分かりませんが、ログなどを追加して、原因調査してはどうでしょうか?
また、手を入れたことが原因なのかは、どのようなものにどのように手を入れたかも分からないので、分かるはずがありません。
前に鳴動していたのであれば、可能性は高いとしか言いようがないかと思います。

通信断に関しても、プログラムにログを追加して、プログラムがどのように動作しているのか確認したほうがよろしいかと思います。
それと同時にパケットモニタでもモニタし、通信断時の原因を探るしかないかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/28 16:24

    YAmaGNZ様,回答ありがとうございます.
    今まで,クライアントPC2またはクライアントPC3にはログは追加していたのですが,クライアントPC兼サーバPCにはログを追加して原因調査していなかったので,ブザーが鳴動しない原因を調査してみます.

    キャンセル

0

データ送信でまともなフロー制御は行われていますか?
例えば、クライアントPC3の処理が重くなって暫くデータを受信できなくなったら、前段のPCで送信データは正しくブロック(及びバッファリング)されますか?
そうで無ければ多段での運用は無理です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/28 14:22

    hichon様,回答ありがとうございます.
    フロー制御は【各装置のフロー制御】に追記したようにやっています.
    >例えば、クライアントPC3の処理が重くなって暫くデータを受信できなくなったら、前段のPCで送信データは正しくブロック(及びバッファリング)されますか?
    とはどういうことでしょうか?知識不足ですいません.
    クライアントPC2またはクライアントPC3はサーバPCと1つのソケットを接続して,情報を6回送信する形なので,送信するときに200msのスリープを入れています.スリープを入れる前は一度に2電文や3電文が一緒に送信されていたのですが,スリープを入れることによって,1電文ずつ送信されることはワイヤーシャークで確認しています.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る