2

サーバーとクライアントプロセスで構成されるプログラムがあります。どちらも Windows システム (Windows 2000 以降のバージョン) で実行されます。2 つのプロセスは、同じマシンまたは 2 つの異なるマシンで実行できます。

クライアントは、サーバーと同じマシンで実行されているかどうかをどのように判断できますか? サーバーが実行されていない場合、クライアントはとにかく機能せず、サーバーがどこにあるかを気にしません。したがって、このケースは問題外です。各 Windows マシンには UUID があると聞きましたが、取得してその目的で使用できますか?

4

3 に答える 3

2

役立つ可能性 のある一意のマシンIDの生成に関する前の質問。MachineGUIDに言及している以前の回答へのリンク

マシン名を報告するAPIをサーバーに追加するのは簡単です。環境変数はCOMPUTERNAMEです。クライアントはそれをチェックできますよね?

これらのケースのいずれかに対処する必要がありますか?

  1. クライアントは実行されていますが、サーバーが応答していないため、応答しないサーバーがリモートマシン上にあるかどうかを知りたいと考えています。
  2. クライアントとサーバーは、同じホストマシン上の2つの異なる仮想マシンで実行されており、「同じマシンで実行されている」と報告する必要があります。
  3. クライアントは、サーバーが実行されているのと同じマシンによってホストされている仮想マシンで実行されており、「同じマシンで実行されている」と報告する必要があります。
  4. クライアントとサーバーは調整されていないネットワークで実行されており、両方に同じ名前が割り当てられている可能性があります。
  5. サーバーは敵対的である可能性があり、クライアントをだまそうとします。

ネットワークカードには一意のMACがあります。サーバーとクライアントの両方が同じMACを報告する場合、それらは同じネットワークカードを使用しています。クライアントとサーバーの両方が異なる仮想マシンで実行されているが、同じネットワークカードを使用している場合、それらは同じマシンで実行されていると思いますか、それとも異なるマシンで実行されていると思いますか?

于 2009-05-22T08:58:41.603 に答える
2

Windows ネットワーキングではコンピュータ名が一意である必要があるため、GetComputerName API を呼び出して、クライアントとサーバーの名前を交換する (そして受信した名前と表示される名前を比較する) だけで十分です。クライアントとサーバーが互いに独立して起動できる場合、このプロセスにはある種のプロトコルが必要になります。クライアントが交換を開始し、サーバーがクライアントから名前を受信した場合にのみその名前を送信するのは理にかなっているようです。クライアントは、同じ名前を見つけた場合、接続を中止できます。

ほとんどの仮想マシン システムでは、仮想マシンに独自の名前を付けることができるため、仮想マシンでテストすることは可能であると思います。しかし、私はすべての仮想化技術について豊富な経験を持っているわけではないので、確実なことは言えません。

于 2009-05-22T10:38:03.913 に答える
1

ループバック tcp 接続を確立してみてはどうでしょうか。または、事前定義されたフォルダーでサーバーによって作成されたロックファイルを確認することもできます...

正確な方法はわかりませんが、Win32 には Unix の /proc ファイルシステムに相当するものがあることは確かです (Windows タスク マネージャーには無料の代替品があると思います。おそらくそのソースを参照してください)。ここでサーバーを検索できます。処理する。

于 2009-05-22T08:54:05.433 に答える