2

我有一个由服务器和客户端进程组成的程序。两者都在 Windows 系统上运行 - Windows 2000 或更高版本。这两个进程可以在同一台机器上运行,也可以在两台不同的机器上运行。

客户端如何确定它是否与服务器运行在同一台机器上?如果服务器未运行,则客户端无论如何都无法工作,并且不关心服务器可能在哪里 - 所以这种情况是不可能的。我听说每台 Windows 机器都有一个 UUID - 我可以获取它并用于此目的吗?

4

3 回答 3

2

上一个关于生成可能有帮助的唯一机器 ID 的问题。 链接到之前提到 MachineGUID 的答案

将 API 添加到报告其机器名称的服务器很简单。环境变量是 COMPUTERNAME。客户可以检查,对吗?

你需要处理这些情况吗?

  1. 客户端正在运行,但服务器没有响应,您想知道无响应的服务器是否在远程计算机上。
  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 回答