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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

4799閲覧

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

dem0nmichik0

総合スコア37

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/10/27 14:53

編集2018/10/28 05:09

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2018/10/27 15:44 編集

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

2018/10/28 05:13

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

回答2

0

ベストアンサー

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

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

投稿2018/10/28 07:10

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dem0nmichik0

2018/10/28 07:24

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

0

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

投稿2018/10/28 03:00

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dem0nmichik0

2018/10/28 05:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問