2012-09-22 41 views
7

標題歸納起來。有什麼方法可以發現本地網絡接口是否通過DHCP分配地址,還是通過java靜態設置地址?以編程方式確定IP地址是通過dhcp分配的,還是手動設置爲java

+0

有趣。你如何處理java? – Jayan

+0

您正在詢問是否通過DHCP分配IP地址......您的意思是本地網絡接口的IP地址,還是任意IP地址?如果是前者,你總是可以抓取'ipconfig'或'ifconfig'的輸出(儘管最好找到合適的系統調用)。 –

+0

試圖確定本地網絡接口。我正在尋找一種跨平臺的方式來做到這一點。如果沒有人願意挖掘自己,只是想避免重蹈覆轍。 – Patrick

回答

3

因此,如您所要求的Win NT'解決方案',這裏是我的代碼。它列出了具有當前配置值的網絡接口。

注意EnableDHCP註冊表鍵值,我認爲這是重點。

正如我在你的問題中已經提到的評論,你至少需要簡單的JNI包裝。

希望這會有所幫助。

更多的信息在這裏:http://support.microsoft.com/kb/314053

#include <windows.h> 

#define NETCARD_ROOT L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards" 
#define TCPIP_ROOT L"SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters\\Interfaces" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    //First enumerate all network adapters 

    HKEY hNetCardsKey; 
    LSTATUS lStatus = ERROR_SUCCESS; 

    lStatus = RegOpenKey(HKEY_LOCAL_MACHINE, 
     NETCARD_ROOT, 
     &hNetCardsKey); 

    if(ERROR_SUCCESS == lStatus) 
    { 
     DWORD dwCards = 0L; 
     DWORD dwMaxSubkeyNameLen = 0L; 
     lStatus = RegQueryInfoKey(hNetCardsKey, NULL, NULL, NULL, &dwCards, 
      &dwMaxSubkeyNameLen, NULL, NULL, NULL, NULL, NULL, NULL); 

     if(ERROR_SUCCESS == lStatus && dwCards) 
     { 
      for(DWORD i = 0; i < dwCards; i++) 
      { 
       TCHAR wszCurrentCardIdxName[MAX_PATH]; 
       wszCurrentCardIdxName[0] = '\0'; 
       lStatus = RegEnumKey(hNetCardsKey, i, 
        wszCurrentCardIdxName, MAX_PATH); 

       if(ERROR_SUCCESS == lStatus) 
       { 
        TCHAR wszAdapterKeyName[MAX_PATH]; 
        wszAdapterKeyName[0] = '\0'; 

        wsprintf(wszAdapterKeyName, L"%s\\%s", NETCARD_ROOT, 
         wszCurrentCardIdxName); 

        HKEY hCardNameKey; 

        lStatus = RegOpenKey(
         HKEY_LOCAL_MACHINE, 
         wszAdapterKeyName, 
         &hCardNameKey); 

        if(ERROR_SUCCESS == lStatus) 
        { 
         TCHAR wszServiceNameGuid[MAX_PATH]; 
         TCHAR wszAdapterName[MAX_PATH]; 

         DWORD dwSize = sizeof(wszServiceNameGuid); 
         wszServiceNameGuid[0] = '\0'; 
         RegQueryValueEx(
          hCardNameKey, 
          L"ServiceName", 
          NULL, 
          NULL, 
          (LPBYTE)wszServiceNameGuid, 
          &dwSize); 

         dwSize = sizeof(wszAdapterName); 
         RegQueryValueEx(
          hCardNameKey, 
          L"Description", 
          NULL, 
          NULL, 
          (LPBYTE)wszAdapterName, 
          &dwSize); 

         OutputDebugStringW(wszServiceNameGuid); 
         OutputDebugStringW(L"\n"); 

         RegCloseKey(hCardNameKey); 

         //Get parameters 
         TCHAR wszCardParamKey[MAX_PATH]; 
         wszCardParamKey[0] = '\0'; 
         wsprintf(wszCardParamKey,L"%s\\%s", TCPIP_ROOT, wszServiceNameGuid); 

         HKEY hParamKey = NULL; 

         lStatus = RegOpenKey(
          HKEY_LOCAL_MACHINE, 
          wszCardParamKey, 
          &hParamKey); 

         if(ERROR_SUCCESS == lStatus) 
         { 
          DWORD dwEnabledDHCP = 0L; 
          DWORD dwDWSize = sizeof(DWORD); 
          TCHAR wszStaticIP[32]; 
          TCHAR wszDHCPIP[32]; 
          DWORD dwIPSize = sizeof(wszDHCPIP); 

          ZeroMemory(wszDHCPIP, dwIPSize); 
          ZeroMemory(wszStaticIP, dwIPSize); 

          lStatus = RegQueryValueEx(
           hParamKey, 
           L"EnableDHCP", 
           NULL, NULL, 
           (LPBYTE)&dwEnabledDHCP, 
           &dwDWSize); 

          if(SUCCEEDED(lStatus)) 
          { 
           wprintf_s(L"Adapter : %s [%s] \n\tDHCP : %s\n", 
            wszServiceNameGuid, 
            wszAdapterName, 
            dwEnabledDHCP 
            ? L"Yes" : L"No"); 
          } 

          lStatus = RegQueryValueEx(
           hParamKey, 
           L"IPAddress", 
           NULL, 
           NULL, 
           (LPBYTE)&wszStaticIP, 
           &dwIPSize); 

          if(SUCCEEDED(lStatus)) 
          { 
           wprintf_s(L"\tConfigured IP Address : %s\n", wszStaticIP); 
          } 

          dwIPSize = sizeof(wszDHCPIP); 
          lStatus = RegQueryValueEx(
           hParamKey, 
           L"DhcpIPAddress", 
           NULL, 
           NULL, 
           (LPBYTE)&wszDHCPIP, 
           &dwIPSize); 

          if(SUCCEEDED(lStatus)) 
          { 
           wprintf_s(L"\tDHCP IP Address : %s\n", wszDHCPIP); 
          } 

          wprintf_s(L"\n"); 

          RegCloseKey(hParamKey); 
         } 

        } 
       } 
      } 
     } 


     RegCloseKey(hNetCardsKey); 
    } 


    return 0; 
} 

簡單的輸出:

Adapter : {6EC2554F-3359-43A2-AADB-57F427DC72FC} [Marvell Yukon 88E8072 PCI-E Gigabit Ethernet Controller] 
     DHCP : No 
     Configured IP Address : 192.168.5.10 
     DHCP IP Address : 192.168.1.102 

Adapter : {2A28BDA8-ED1D-4E6E-8990-485EE1836828} [Sony Ericsson Device 0016 USB Ethernet Emulation (NDIS 5)] 
     DHCP : Yes 
     Configured IP Address : 
     DHCP IP Address : 0.0.0.0 

Adapter : {491DC095-155F-4572-B975-2E1703C17632} [Microsoft Windows Mobile Remote Adapter] 
     DHCP : Yes 
     Configured IP Address : 
     DHCP IP Address : 169.254.2.2 

Adapter : {5F987E64-E804-42DA-9453-8E479B6FC835} [Broadcom 802.11b/g Network adapter] 
     DHCP : Yes 
     Configured IP Address : 
     DHCP IP Address : 192.168.1.14 
+0

太棒了 - 謝謝。 – Patrick

0

對不起,我不這麼認爲。
你不能通過JAVA, 這樣做,因爲java與OS的網絡接口只是JVM。
一個jni可以被歸結爲可能做的任務。

+0

將無法​​通過jni意味着你可以通過java做到這一點?或者你的意思是它本身並不具備可用的信息。 – Patrick

+0

我的意思是,Java不能訪問你問的信息,也許一個C代碼可能會給那個Java。當然一個圖書館可能也是這樣做的,但這也將是操作系統特定的! –

相關問題