2012-09-22 11 views
7

Título lo resume. ¿Hay alguna manera de descubrir si una interfaz de red local tiene su dirección asignada a través de DHCP o si está establecida estáticamente a través de Java?determina programáticamente si la dirección IP se asigna mediante dhcp o se establece manualmente en java

+0

interesante. ¿Cómo te va con out java? – Jayan

+0

Está preguntando sobre la determinación de si una dirección IP se asigna a través de DHCP ... ¿se refiere a la dirección IP de una interfaz de red local, o cualquier dirección IP arbitraria? Si es lo primero, siempre puede raspar la salida de 'ipconfig' o' ifconfig' (aunque probablemente sea mejor encontrar la llamada al sistema apropiada). –

+0

Solo intento determinar la interfaz de red local. Estoy buscando una forma de plataforma cruzada para hacerlo. Si no hay nadie que ya esté contento de profundizar en mí mismo, solo quería evitar reinventar la rueda. – Patrick

Respuesta

3

Por lo tanto, como solicitó la 'solución' Win NT solamente, aquí está mi código. Enumera las interfaces de red con los valores configurados actuales.

Nota Valor de clave de registro EnableDHCP, creo que este es el punto.

Como ya mencioné en el comentario bajo su pregunta, necesita al menos el envoltorio JNI simple.

Espero que esto ayude.

información más aquí: 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; 
} 

salida simple:

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

maravilloso, gracias. – Patrick

0

Lo siento, no, no lo creo.
no puede hacerlo a través de JAVA, ya que la interfaz de Java con la red del sistema operativo es solo la JVM.
Un jni se puede resumir para hacer la tarea tal vez.

+0

no podría hacerlo a través de un jni significa que puede hacerlo a través de Java? ¿O quiso decir que no está disponible la información de forma nativa? – Patrick

+0

quiero decir, java no puede acceder a la información que está pidiendo, tal vez un código c puede darle java. ¡por supuesto, una biblioteca puede hacer lo mismo, pero eso también sería un OS específico! –

Cuestiones relacionadas