⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 display_c.cpp

📁 实现了在Java下调用底层C++代码来使用win32API来获取当前网内的可用IP地址
💻 CPP
字号:
#include "FindIP.h"

#ifndef UNICODE 
#define UNICODE 
#endif

#include <windows.h>
#include <stdio.h>
#include <winnetwk.h>
#include <winsock.h>
#include <wsipx.h>
#include <wsnwlink.h>
#include <string>
using namespace std;
#include   <conio.h>
#pragma comment(lib, "Mpr.lib")
#pragma comment(lib, "WSock32.lib")

BOOL WINAPI EnumerateFunc(LPNETRESOURCE lpnr); 
void DisplayStruct(int i, LPNETRESOURCE lpnrLocal);
char * getHostName();
void chr2wch(const char* buffer, wchar_t* wBuf);
LPWSTR ConvertLPCSTRToLPWSTR (char* pCstring);
char* getIP(char *s);

JNIEXPORT void JNICALL Java_FindIP_displayIP(JNIEnv *, jobject)
{ 
	LPNETRESOURCE lpnr = NULL; 

	if (EnumerateFunc(lpnr) == FALSE)
		printf("Call to ENumerateFunc failed\n"); 
}


BOOL WINAPI EnumerateFunc(LPNETRESOURCE lpnr) 
{ 
	DWORD dwResult, dwResultEnum; 
	HANDLE hEnum; 
	DWORD cbBuffer = 16384; // 16K is a good size 
	DWORD cEntries = -1; // enumerate all possible entries 
	LPNETRESOURCE lpnrLocal; // pointer to enumerated structures 
	DWORD i; 
	// 
	// Call the WNetOpenEnum function to begin the enumeration. 
	// 
	dwResult = WNetOpenEnum(RESOURCE_GLOBALNET, // all network resources 
		RESOURCETYPE_ANY, // all resources 
		0, // enumerate all resources 
		lpnr, // NULL first time the function is called 
		&hEnum); // handle to the resource 

	if (dwResult != NO_ERROR) { 
		/*printf("WnetOpenEnum failed with error %d\n", dwResult); */
		return FALSE; 
	} 
	// 
	// Call the GlobalAlloc function to allocate resources. 
	// 
	lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer); 
	if (lpnrLocal == NULL) { 
		/*printf("WnetOpenEnum failed with error %d\n", dwResult); */
		// NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetOpenEnum"); 
		return FALSE; 
	} 

	do { 
		// 
		// Initialize the buffer. 
		// 
		ZeroMemory(lpnrLocal, cbBuffer); 
		// 
		// Call the WNetEnumResource function to continue 
		// the enumeration. 
		// 
		dwResultEnum = WNetEnumResource(hEnum, // resource handle 
			&cEntries, // defined locally as -1 
			lpnrLocal, // LPNETRESOURCE 
			&cbBuffer); // buffer size 
		// 
		// If the call succeeds, loop through the structures. 
		// 
		if (dwResultEnum == NO_ERROR) { 
			for (i = 0; i < cEntries; i++) { 
				// Call an application-defined function to 
				// display the contents of the NETRESOURCE structures. 
				// 
				DisplayStruct(i, &lpnrLocal[i]); 

				// If the NETRESOURCE structure represents a container resource, 
				// call the EnumerateFunc function recursively. 

				if (RESOURCEUSAGE_CONTAINER == (lpnrLocal[i].dwUsage 
					& RESOURCEUSAGE_CONTAINER)) 
					// if(!EnumerateFunc(hwnd, hdc, &lpnrLocal[i])) 
					/*if (!EnumerateFunc(&lpnrLocal[i])) 
					printf("EnumerateFunc returned FALSE\n"); */
					EnumerateFunc(&lpnrLocal[i]);
				// TextOut(hdc, 10, 10, "EnumerateFunc returned FALSE.", 29); 
			} 
		} 
		// Process errors. 
		// 
		else if (dwResultEnum != ERROR_NO_MORE_ITEMS) { 
			printf("WNetEnumResource failed with error %d\n", dwResultEnum); 

			// NetErrorHandler(hwnd, dwResultEnum, (LPSTR)"WNetEnumResource"); 
			break; 
		} 
	} 
	// 
	// End do. 
	// 
	while (dwResultEnum != ERROR_NO_MORE_ITEMS); 
	// 
	// Call the GlobalFree function to free the memory. 
	// 
	GlobalFree((HGLOBAL) lpnrLocal); 
	// 
	// Call WNetCloseEnum to end the enumeration. 
	// 
	dwResult = WNetCloseEnum(hEnum); 

	if (dwResult != NO_ERROR) { 
		// 
		// Process errors. 
		// 
		printf("WNetCloseEnum failed with error %d\n", dwResult); 
		// NetErrorHandler(hwnd, dwResult, (LPSTR)"WNetCloseEnum"); 
		return FALSE; 
	}

	return TRUE; 
} 

void DisplayStruct(int i, LPNETRESOURCE lpnrLocal) 
{ 
	/*printf("NETRESOURCE[%d] Scope: ", i); 
	switch (lpnrLocal->dwScope)
	{ 
	case (RESOURCE_CONNECTED): 
	printf("connected\n"); 
	break; 
	case (RESOURCE_GLOBALNET): 
	printf("all resources\n"); 
	break; 
	case (RESOURCE_REMEMBERED): 
	printf("remembered\n"); 
	break; 
	default: 
	printf("unknown scope %d\n", lpnrLocal->dwScope); 
	break; 
	} */

	/*printf("NETRESOURCE[%d] Type: ", i); 
	switch (lpnrLocal->dwType)
	{ 
	case (RESOURCETYPE_ANY): 
	printf("any\n"); 
	break; 
	case (RESOURCETYPE_DISK): 
	printf("disk\n"); 
	break; 
	case (RESOURCETYPE_PRINT): 
	printf("print\n"); 
	break; 
	default: 
	printf("unknown type %d\n", lpnrLocal->dwType); 
	break; 
	} */

	/*printf("NETRESOURCE[%d] DisplayType: ", i); 
	switch (lpnrLocal->dwDisplayType)
	{ 
	case (RESOURCEDISPLAYTYPE_GENERIC): 
	printf("generic\n"); 
	break; 
	case (RESOURCEDISPLAYTYPE_DOMAIN): 
	printf("domain\n"); 
	break; 
	case (RESOURCEDISPLAYTYPE_SERVER): 
	printf("server\n"); 
	break; 
	case (RESOURCEDISPLAYTYPE_SHARE): 
	printf("share\n"); 
	break; 
	case (RESOURCEDISPLAYTYPE_FILE): 
	printf("file\n"); 
	break; 
	case (RESOURCEDISPLAYTYPE_GROUP): 
	printf("group\n"); 
	break; 
	case (RESOURCEDISPLAYTYPE_NETWORK): 
	printf("network\n"); 
	break; 
	default: 
	printf("unknown display type %d\n", lpnrLocal->dwDisplayType); 
	break; 
	} */

	//printf("NETRESOURCE[%d] Usage: 0x%x = ", i, lpnrLocal->dwUsage); 
	//if (lpnrLocal->dwUsage & RESOURCEUSAGE_CONNECTABLE) 
	//	printf("connectable "); 
	//if (lpnrLocal->dwUsage & RESOURCEUSAGE_CONTAINER) 
	//	printf("container "); 
	//printf("\n"); 
	char *host;
	char hostname[230];
	host = getHostName();
	hostname[0] = '\\';
	hostname[1] = '\\';
	int j;
	for(j=0;host[j]!='\0';j++)
	{
		hostname[j+2] = host[j]-32;
	}
	hostname[j+2] = '\0';
	wchar_t* hostnameL = ConvertLPCSTRToLPWSTR(hostname);
	if(lpnrLocal->dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
	{
		if(wcscmp(hostnameL,lpnrLocal->lpRemoteName)!=0)
		{
			//printf("NETRESOURCE[%d] Localname: %S\n", i, lpnrLocal->lpLocalName); 
			printf("NETRESOURCE[%d] Remotename: %S\n", i, lpnrLocal->lpRemoteName); 
			//printf("NETRESOURCE[%d] Comment: %S\n", i, lpnrLocal->lpComment);
			DWORD dwNum=WideCharToMultiByte(CP_OEMCP,NULL,lpnrLocal->lpRemoteName,-1,NULL,0,NULL,FALSE);
			char* remoteName=new	char[dwNum];
			if(!remoteName)
			{
				delete []remoteName;
			}
			WideCharToMultiByte(CP_OEMCP,NULL,lpnrLocal->lpRemoteName,-1,remoteName,dwNum,NULL,FALSE);
			remoteName=remoteName+2;
			getIP(remoteName);			
			/*printf("NETRESOURCE[%d] Provider: %S\n", i, lpnrLocal->lpProvider); */
			printf("\n");
		}
	}
} 
char * getHostName()
{
	////////////////
	// 初始化 Windows sockets API. 要求版本为 version 1.1
	//
	WORD wVersionRequested = MAKEWORD(1, 1);
	WSADATA wsaData;
	if (WSAStartup(wVersionRequested, &wsaData)) {
		printf("WSAStartup failed %s\n", WSAGetLastError());
		exit(0);
	}

	//////////////////
	// 获得主机名.
	//
	char hostname[200];
	int res = gethostname(hostname, sizeof(hostname));
	if (res != 0) {
		printf("Error: %u\n", WSAGetLastError());
		exit(0);
	}
	//printf("hostname=%s\n", hostname);
	//////////////////
	//// 根据主机名获取主机信息. 
	////
	//hostent* pHostent = gethostbyname(hostname);
	//if (pHostent==NULL) {
	//   printf("Error: %u\n", WSAGetLastError());
	//   return -1;
	//}
	////////////////////
	//// 解析返回的hostent信息.
	////
	//hostent& he = *pHostent;
	//printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n",
	//   he.h_name, he.h_aliases, he.h_addrtype, he.h_length);
	//
	//sockaddr_in sa;
	//for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {
	//   memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);
	//   // 输出机器的IP地址.
	//   printf("Address: %s\n", inet_ntoa(sa.sin_addr)); // 显示地址串
	//}
	//////////////////
	// 终止 Windows sockets API
	//
	WSACleanup();
	return hostname;
}     

LPWSTR ConvertLPCSTRToLPWSTR (char* pCstring) 

{ 

	LPWSTR pszOut = NULL; 

	if (pCstring != NULL) 

	{ 

		int nInputStrLen = strlen (pCstring); 

		// Double NULL Termination 

		int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, pCstring, nInputStrLen, NULL, 0) + 2; 

		pszOut = new WCHAR [nOutputStrLen]; 

		if (pszOut) 

		{ 

			memset (pszOut, 0x00, sizeof (WCHAR)*nOutputStrLen); 

			MultiByteToWideChar (CP_ACP, 0, pCstring, nInputStrLen, pszOut, nInputStrLen); 

		} 

	} 

	return pszOut; 

} 



char* getIP(char *s)
{   
	WORD   wVersionRequested;   
	WSADATA   wsaData;   
	LPSTR   szIPAddr;   
	//Start   up   WinSock   
 	wVersionRequested   =   MAKEWORD(1,   1);   
	if(WSAStartup(wVersionRequested,   &wsaData))   
	{   
		printf("ERROR   No.1!!!   Program   Terminate.");   
		exit(1);   
	}
	char   *p2;   
	hostent   *p;   
	DWORD   dwIPAddr;   

	//printf("Local   Host   Name:   ");   
	p   =   gethostbyname(s);
	if(!p)   
	{
		printf("ERROR!!!   Bad   host   lookup.   Program   Terminate.");   
		exit(1);   
	}
	int   i=0;   
	while(p->h_aliases[i])   
	{   
		printf("   %s\n",p->h_aliases[i]);   
		i++;   
	}   
	//Get   the   IpAddress,这里可以对付多个IP地址的主机   
	for(int   i=0;p->h_addr_list[i]!=0;i++)   
	{   
		p2   =   inet_ntoa(*((in_addr   *)p->h_addr_list[i]));   
		printf("Local   IP   Adress:   %s\n",p2);   
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -