📄 display_c.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 + -