標題歸納起來。有什麼方法可以發現本地網絡接口是否通過DHCP分配地址,還是通過java靜態設置地址?以編程方式確定IP地址是通過dhcp分配的,還是手動設置爲java
回答
因此,如您所要求的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
太棒了 - 謝謝。 – Patrick
對不起,我不這麼認爲。
你不能通過JAVA, 這樣做,因爲java與OS的網絡接口只是JVM。
一個jni可以被歸結爲可能做的任務。
將無法通過jni意味着你可以通過java做到這一點?或者你的意思是它本身並不具備可用的信息。 – Patrick
我的意思是,Java不能訪問你問的信息,也許一個C代碼可能會給那個Java。當然一個圖書館可能也是這樣做的,但這也將是操作系統特定的! –
- 1. 以編程方式確定連接是通過HTTP還是通過HTTPS進行?
- 2. 的Windows:以編程方式檢索手動配置IPv6地址
- 3. 發現IP地址是DHCP還是靜態
- 4. 如何以編程方式設置我的IP地址?
- 5. 以編程方式配置iPad IP地址
- 6. 如何確定radioButton.Checked是以編程方式設置還是通過鼠標點擊?
- 7. 手機的當前IP地址,無論是通過WiFi還是3G連接
- 8. iOS:以編程方式確定WiFi連接是2.4Ghz還是5Ghz
- 9. 確定IP地址是否爲蜂窩IP地址
- 10. 是否可以通過編程方式爲藍牙配對設置引腳?
- 11. 設置使用DHCP編程從我的Android應用程序的IP地址?
- 12. 如何通過Fedora上的bash找到DHCP分配的IP地址?
- 13. 確定組合框文本是IP地址還是主機名
- 14. 手機的IP地址是
- 15. 有沒有辦法在Virtualbox通過DHCP分配的VagrantFile中使用IP地址?
- 16. 如何以編程方式確定將使用哪個源IP地址到達給定的目標IP地址
- 17. 以編程方式檢索infiniband設備的IP地址
- 18. 如何以編程方式確定URL是通用鏈接還是普通網址?
- 19. 在pi(Apache,DHCP)上爲ip地址設置域名
- 20. 是否可以通過IP地址找到用戶的位置?
- 21. 如何以編程方式確定特定進程是32位還是64位
- 22. 是否可以通過CloudFlare API挑戰特定的IP地址?
- 23. 確定兩個IP地址是否可以通信
- 24. 如何通過DHCP可靠地獲取IP地址?
- 25. 如何以編程方式確定URI,主機名或IP地址是否屬於本地主機?
- 26. 是否有可能以編程方式更新配置設置?
- 27. 是否可以將任意ip地址設置爲tcpClient?
- 28. 是否可以通過編程方式在jPicker中設置活動顏色?
- 29. 以編程方式配置IPhone設置
- 30. 有沒有辦法確定JS事件是以編程方式還是通過實際的交互來觸發?
有趣。你如何處理java? – Jayan
您正在詢問是否通過DHCP分配IP地址......您的意思是本地網絡接口的IP地址,還是任意IP地址?如果是前者,你總是可以抓取'ipconfig'或'ifconfig'的輸出(儘管最好找到合適的系統調用)。 –
試圖確定本地網絡接口。我正在尋找一種跨平臺的方式來做到這一點。如果沒有人願意挖掘自己,只是想避免重蹈覆轍。 – Patrick