java需要设置IP地址吗,以编程方式确定IP地址是通过dhcp分配还是在Java中手动设置...

Is there any way to discover if a local network interface has it's address assigned via DHCP or if it is statically set through Java?

解决方案

So, as you requested Win NT 'solution' only, here is my code.It lists network interfaces with current configured values.

Note EnableDHCP registry key value, I think this is the point.

As I already mentioned in comment under your question, you need as least simple JNI wrapper.

Hope this helps.

#include

#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;

}

Simple output:

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值