• ベストアンサー

サーバ・クライアント環境で2重起動防止したい

現在、2重起動防止の機能を考えています。 システムとしてはサーバー(Win2003Server)にアプリを置いて、クライアント(WinXP)からリモート接続で繋いでそのアプリを起動します。この時、クライアント1にてアプリを実行していた場合はサーバ及び他クライアントではアプリを起動できないようにしたい。 CreateMutexとWaitForSingleObjectで出来るかと思ったのですが、(作り方が悪いのか)出来ませんでした。(x_x) VC++6.0を使用しています。VBの経験はそれなりにありますが、VCは初心者です。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.5

再び失礼します。 > すいません。用語が良くわかりません。ブロードキャストとはなんでしょうか? 仮にも技術者なら多少はご自分で調べてください… ブロードキャストでググれば山ほど出てきます。 軽く説明しておくと、不特定多数のアドレスに対してメッセージを投げることです。 例えば 192.168.0.255 宛てにメッセージを投げると 192.168.0.1~192.168.0.254 に向けて投げたことことになります。 またブロードキャストを利用する場合はTCP/IPではなくUDPプロトコルを使用します。 UDPは簡単に言えば投げっぱなしのプロトコルです。 TCP/IPのように「送ったよ」「届いたよ」というやりとりがありません。 その代わり高速です。 ちょっと今は忙しくて、また過去のソースも今は手元にないので、サンプルをお出しすることができないのですが、ブロードキャストとUDPをキーに調べてみてください。

jazzkazz
質問者

お礼

お忙しい所、解説ありがとうございます。 ご説明の内容理解できました。 > ブロードキャストとUDPをキーに調べてみてください。 調べてみます。 ありがとうございました。

その他の回答 (4)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

No.3です。No.2さんの一時ファイルも、私のいうロックファイルも同じと思いますけどね。 それでロックファイルの削除ですが、正常な終了処理ならVCだとOnExitハンドラなどで消せば良いと思いますけど異常処理では難しいでしょうね。 Win32の場合、誰かがオープンしているファイルは消せないという性質を利用して、起動したプロセスはまず最初にロックファイルを消すというのではどうでしょう。 他のプロセスがロックファイルをオープンしていれば消えませんので問題ないですし、異常で残ったファイルなら消せるでしょう。 # 未確認なのでよく確認してください

jazzkazz
質問者

お礼

回答ありがとうございます。 この方法、検討してみます。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

やりたいことがイマイチ見えないのですけど。 アプリのプロセスはサーバ上で動作するのかクライアント上で動作するのかどっちですか。 サーバがアプリケーション・サーバなのか単にアプリの実行ファイルを置くファイル・サーバなのかと言い換えても良いですけど。 前者ならサーバ上でだけ動作するのでミューテックスによる排他制御で良いでしょう。書き方の問題です。 後者ならアプリの実行ファイルと同じフォルダにロックファイルを作る方法で排他制御するのが良いでしょう。

jazzkazz
質問者

お礼

サーバーでもクライアントでもアプリは起動できるようにしておきたいです。 > 同じフォルダにロックファイルを作る方法 #2のpchan0022000さんの時に私が思っていた懸念事項はコレで解決しそうですね。 ですが、もしロックファイルを作った状態でアプリが不具合やシステムエラーで終了したらロックファイルが残ってしまいますよね。この場合、消す必要があるかと思います。手動では消さずに何らかのタイミングで自動的に消すとか方法はあるのでしょうか。 もし、アプリのプログラムの色々な処理の場所で『エラーが発生したらロックファイルを消す』といった処理を組み込む必要があるとすると手前勝手ではありますが結構手間が掛かってしまいます。(私の考えではそう思ってしまいました。) どの様にうまい対処をすればよろしいのでしょうか。 もう少しお力をお貸しください。

回答No.2

CreateMutexとWaitForSingleObjectを使用した方法で、サーバー上で2つ同時に起動しましたか? サーバー上で2つ同時に起動するなら、サーバークライアント環境が問題でなくて、その処理に誤りがある事になるのですが、その辺の切り分けはできているのでしょうか。 サーバークライアント環境なのが問題でCreateMutexが使えないのであれば、起動したら一時ファイルを作成して終了時にそのファイルを削除するようにすれば、起動しているかどうかの判断はできると思います。

jazzkazz
質問者

補足

サーバーで2つのアプリ起動テスト(CreateMutexとWaitForSingleObject)は動作確認済です。2重起動チェック出来てます。クライアントとサーバーで起動させる場合はムリでした。 一時ファイルを作成する方法ですが、不用意にあるいは誤って別のクライアントから消された場合に問題があるかと思います。

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.1

ミューテックスは同じマシン内でしか通用しないと思います。 以前にやった仕組みは、アプリを立ち上げたらブロードキャストでメッセージを投げます。 応答があれば他のマシンで起動中ということでアプリは終了します。 無事起動できた場合は、ブロードキャストからのメッセージを待ちます。 メッセージが送られてきたら応答します。 こんな感じのものを作りました。 vb.netでしかも知識があいまいなまま作ったのでこれが一般的かはわかりませんが、ご参考までに。

jazzkazz
質問者

お礼

回答ありがとうございます。 >ブロードキャストでメッセージを投げます すいません。用語が良くわかりません。ブロードキャストとはなんでしょうか? 以下の処理につきましても、何となく出来そうかなとは判りましたが、お忙しいかと思いますが、サンプルプログラムをお時間あったら教えていただけませんでしょうか。 私の方でももっと勉強してみますが、よろしくお願いいたします。