2009-05-22 26 views
2

我有一個包含服務器和客戶端進程的程序。兩者都在Windows系統上運行 - Windows 2000或更高版本。這兩個進程可以在同一臺機器上或兩臺不同的機器上運行。如何確定Windows機器的身份?

客戶端如何確定它是否與服務器在同一臺機器上運行?如果服務器沒有運行,客戶端無法正常工作,並且不關心服務器可能在哪裏 - 所以這種情況是不可能的。我聽說每臺Windows機器都有一個UUID--我可以獲得它並用於此目的嗎?

+0

如果他們都應該在同一臺機器上運行,但服務器發生不運行,如果客戶端報告「我們在同一臺機器上運行」或「因爲服務器沒有運行,我不知道是否我們在同一臺機器上運行「? – 2009-05-22 08:56:04

回答

2

Windows網絡需要計算機名稱是唯一的,因此調用GetComputerName api並使客戶端和服務器交換名稱(並將接收到的名稱與它們看到的名稱進行比較)就足夠了。如果客戶端和服務器可以獨立啓動,那麼在這個過程中你需要某種協議。客戶端啓動交換似乎是合乎邏輯的,服務器只在從客戶端收到名稱時才發送它的名稱。如果客戶端看到相同的名稱,則可以中止連接。

我相信大多數虛擬機系統都會允許虛擬機擁有自己的名字,所以它應該仍然可以在虛擬機上進行測試。然而,我並不具備所有虛擬化技術的豐富經驗,所以不能肯定地說。

1

如何嘗試建立一個環回tcp連接?或者可能檢查服務器在預定義文件夾中創建的一些鎖定文件...我不確切知道如何,但在Win32中有相當於Unix中/ proc文件系統的東西(我認爲有免費替換Windows任務管理器,也許你可以看看他們的來源),你可以在哪裏搜索你的服務器進程。

2

Previous question about generating a unique machine id這可能有幫助。 Link to previous answer which mentions MachineGUID

將API添加到報告其機器名的服務器很簡單。環境變量是COMPUTERNAME。客戶可以檢查,對嗎?

您是否需要處理這些情況?

  1. 客戶端正在運行,但服務器沒有響應,並且您想知道無響應服務器是否在遠程計算機上。
  2. 客戶端和服務器在同一臺主機上的兩臺不同的虛擬機上運行,​​並且您希望將其報告爲「在同一臺計算機上運行」。
  3. 客戶端運行在與運行服務器的同一臺機器上的虛擬機中,並且您希望將其報告爲「運行在同一臺計算機上」。
  4. 客戶端和服務器在不協調的網絡上運行,並且可能都被分配了相同的名稱。
  5. 服務器可能是敵對的,並會試圖欺騙客戶端。

網卡將具有唯一的MAC。如果服務器和客戶端報告相同的MAC,則他們使用相同的網卡。如果客戶端和服務器都在不同的虛擬機上運行,​​但使用相同的網卡,您認爲它們運行在同一臺機器上還是不同的機器上?

相關問題