06-20-2021 08:01 PM
LabVIEWで作成したTCP通信を行うソフトの実行ファイルを多重起動をさせた際に、最初に起動したものをサーバ、2つ目以降に起動したものをクライアントに自動で切り替えを行わせたいと考えています。
現在は、起動した際に「TCPリスナを作成」でサーバを立ち上げようとして、2つ目以降の場合はそこでエラーが発生するのでクライアントのモードに切り替える、といった感じかなと思っています。
ただ、1つ目を起動させて接続するクライアント数を指定して手動でサーバを立ち上げる方法を取る場合だと、その前に2つ目以降を起動させてしまうと、結局手動でサーバかクライアントを選択せざるを得ないのではないかと思っています。
何か良い手段があれば教えてください
解決済! 解決策の投稿を見る。
06-22-2021 01:03 AM
使用ケースが理解できません。前提条件を教えてください。
・TCP通信を使うということはサーバとクライアント(1~N)は別のPC(ターゲット)?
・サーバを複数起動して「TCPリスナを作成」でエラーが出るということは同一PC?
・1つ目の判定が終わる前に2つ目を起動してしまうとうことは別のPC?
そもそもなぜ同一EXEで自動切換えしたいのでしょうか?
どれがサーバになるかわからなければクライアントはどこに接続すればいいかわからないのでは?
06-22-2021 09:24 PM
ふわっとした質問ですみません。
同一PC内で、作成したソフトを多重起動させて最初に起動したソフトを親(サーバ)、以降を子(クライアント)としてプロセス間通信を行い、親から子にTCP通信でコマンドを送ることによって子を操作する、ということを行おうとしています。
例を挙げますと、足し算を行うEXEを複数起動させて、それぞれ足す数/足される数を入力し、親のソフトで「=」ボタンを押すと、子のソフトでも計算される、というものです。
その際に、起動したソフトが親か子かを認識するために、固定のポートでサーバが立ち上がるか、というのを条件にしようかと考えています。最初に起動したソフトであれば、そのポートが使用できるためサーバとして立ち上がり自身が親だと判断できる、それ以降に起動したソフトであれば既にそのポートは使用されているため、クライアントとして立ち上がり自身が子だと判断できる、といった具合です。
この親と子を判別するに当たって、わざわざポートを使用してサーバが立ち上がるかどうかを試すのではなく、多重起動させると例えばそれぞれのソフトに立ち上がった順番みたいなのが降られる、といったことがあるのか、ということを知りたいです。
06-23-2021 12:48 AM
1台のPCの中で、同一のexeを多重起動させて仕事を分担させたいということでしょうか。それならばクライアントの接続先はlocalhost一択でいいか。
TCPリスンVIは確かに同じポートで多重リスンするとエラーを吐くけど、別のexeで起動されるとダメでしょう。
コマンドプロンプトでtasklist使えば、動作中のexeを探すことはできます。たとえば「Get VI Version.exe」を多重起動してtasklistコマンドをシステム実行VIに投げると、
1個のとき
2個のとき
無いとき
それぞれにPIDは付くけど、値は前後関係を示さない。
もし同一PC内で、メインVIからエージェントVIを多重起動(途中で追加・削除、フロントパネルの表示・非表示、エージェント側でUI操作やCloseも可能)して、それぞれ異なる条件を与えて同じ処理をさせたいなら、非同期並列VIのほうがフィットすると思いますが、同一exeの多重起動には何か違う意図があるのでしょうか?