MFC获取本机所有IP、局域网所有IP、本机和局域网可连接IP

发布于:2025-06-29 ⋅ 阅读:(14) ⋅ 点赞:(0)

获取本机所有IP地址

// 获取本机所有IP地址
int CMachine::GetLocalIPs(std::vector<CString>& vIPValue)
{//返回IP数量, -1表示获取失败
	vIPValue.clear();
	int IpNum = 0;
	//1.初始化wsa  
	WSADATA wsaData;
	int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (ret != 0)
	{
		return -1;
	}
	//2.获取主机名  
	char hostname[256];
	ret = gethostname(hostname, sizeof(hostname));
	if (ret == SOCKET_ERROR)
	{
		return -1;
	}
	//3.获取主机ip  
	HOSTENT* host = gethostbyname(hostname);
	if (host == NULL)
	{
		return -1;
	}
	//4.逐个转化为char*并拷贝返回  
	IpNum = host->h_length;
	for (int i = 0; i < IpNum; i++)
	{
		char ip[30];
		CString strtmp;
		in_addr* addr = (in_addr*)*host->h_addr_list;
		strcpy(ip, inet_ntoa(addr[i]));
		strtmp = ip;
		vIPValue.push_back(strtmp);
	}
	WSACleanup();
	return IpNum;
}

获取局域网内所有IP地址

// 获取局域网内所有IP地址
int CMachine::GetLanIPs(std::vector<CString>& vIPValue)
{//返回IP数量, -1表示获取失败
	vIPValue.clear();
	int IpNum = 0;
	//1.初始化wsa  
	WSADATA wsaData;
	int ret = WSAStartup(MAKEWORD(1, 1), &wsaData);
	if (ret != 0)
	{
		return -1;
	}
	//2.获取主机名  
	char hostname[256];
	gethostname(hostname, sizeof(hostname));
	CString strHostName;
	strHostName = hostname;
	//3.搜索局域网内主机
	DWORD dwScope = RESOURCE_CONTEXT;
	NETRESOURCE *NetResource = NULL;
	HANDLE hEnum;

	WNetOpenEnum(dwScope, NULL, NULL, NULL, &hEnum);
	if (hEnum)
	{
		DWORD Count = 0xFFFFFFFF;
		DWORD BufferSize = 2048;
		LPVOID Buffer = new char[2048];

		WNetEnumResource(hEnum, &Count, Buffer, &BufferSize);
		NetResource = (NETRESOURCE *)Buffer;

		for (unsigned int i=0; i<Count; i++, NetResource++)
		{
			if (NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY)
			{
				if (NetResource->lpRemoteName)
				{
					CString strFullName = NetResource->lpRemoteName;
					if (0 == strFullName.Left(2).Compare(_T("\\\\"))) 
						strFullName = strFullName.Right(strFullName.GetLength() - 2);
					if (strFullName == strHostName)
					{
						continue;
					}
					const char* cchostname = CString2ConstChar(strFullName);
					HOSTENT* host = gethostbyname(cchostname);
					delete[] cchostname;
					if (host != NULL)
					{
 						CString strtmp;
						struct in_addr *ptr;
						ptr = (struct in_addr *)host->h_addr_list[0];

						int a = ptr->S_un.S_un_b.s_b1;
						int b = ptr->S_un.S_un_b.s_b2;
						int c = ptr->S_un.S_un_b.s_b3;
						int d = ptr->S_un.S_un_b.s_b4;

						strtmp.Format(_T("%d.%d.%d.%d"), a, b, c, d);
						vIPValue.push_back(strtmp);
						IpNum++;
					}
				}
			}
		}
	}
	WSACleanup();
	return IpNum;
}

搜索本地可连通IP

// 搜索本地可连通IP
int CMachine::SearchEnableIP()
{//返回值:0可连通IP成功写入配置文件 1网络不通 2连接redis服务器失败 3创建命令客户端失败 4订阅消息失败 5写配置文件失败
	//获取本机IP
	std::vector<CString> IPValue;
	int IPNum = GetLocalIPs(IPValue);
	if (IPNum <= 0)
	{
		CString strtmp = _T("127.0.0.1");
		IPValue.push_back(strtmp);
		IPNum = 1;
	}
	//测试网路络连接
	for (int i = 0; i < IPNum; i++)
	{
		const char* ccIP = CString2ConstChar(IPValue.at(i));
		if (is_access_remote_host(ccIP) != 0)
		{
			IPValue.erase(IPValue.begin() + i);
			IPNum = IPValue.size();
		}
		delete[] ccIP;
	}
	if (IPNum <= 0)
	{
		return 1;//网络不通
	}
	//连接redis服务器
	for (int i = 0; i < IPNum; i++)
	{
		disconnect_redis_server();
		const char* ccIP = CString2ConstChar(IPValue.at(i));
		if (!connect_redis_server(ccIP, 6379, 5))
		{
			IPValue.erase(IPValue.begin() + i);
			IPNum = IPValue.size();
			i--;
		}
		else
		{
			bool bConnected = false;
			get_master_dsp_connect_status(bConnected);
			if (!bConnected)
			{
				IPValue.erase(IPValue.begin() + i);
				IPNum = IPValue.size();
				i--;
			}
		}
		delete[] ccIP;
	}
	if (IPNum <= 0)
	{
		return 2;//连接redis服务器失败
	}
	//创建命令客户端
	for (int i = 0; i < IPNum; i++)
	{
		const char* ccIP = CString2ConstChar(IPValue.at(i));
		if (!create_master_cmd_client(ccIP))
		{
			IPValue.erase(IPValue.begin() + i);
			IPNum = IPValue.size();
			i--;
		}
		delete[] ccIP;
	}
	if (IPNum <= 0)
	{
		return 3;//创建命令客户端失败
	}
	//订阅消息
	for (int i = 0; i < IPNum; i++)
	{
		const char* ccIP = CString2ConstChar(IPValue.at(i));
		if (!setup_master_subcriber(ccIP))
		{
			IPValue.erase(IPValue.begin() + i);
			IPNum = IPValue.size();
			i--;
		}
		delete[] ccIP;
	}
	if (IPNum <= 0)
	{
		return 4;//订阅消息失败
	}
	notice_exit();
	destory_master_cmd_client();
	disconnect_redis_server();

	char buf[30] = "";
	if (!WritePrivateProfileString(_T("CutterServer"), _T("IP"), IPValue.at(0), m_ConfigPath))
	{
		return 5;
	}
	return 0;
}

搜索局域网内可连通IP

// 搜索局域网内可连通IP
int CMachine::SearchLanEnableIP()
{//返回值:0可连通IP成功写入配置文件 -1局域网内无其他计算机 1网络不通 2创建从机命令客户端失败 3写配置文件失败
 //获取本机IP
	std::vector<CString> IPValue;
	int IPNum = GetLanIPs(IPValue);
	if (IPNum <= 0)
	{
		return -1;
	}
	//测试网路络连接
	for (int i = 0; i < IPNum; i++)
	{
		const char* ccIP = CString2ConstChar(IPValue.at(i));
		if (is_access_remote_host(ccIP) != 0)
		{
			IPValue.erase(IPValue.begin() + i);
			IPNum = IPValue.size();
		}
		delete[] ccIP;
	}
	if (IPNum <= 0)
	{
		return 1;//网络不通
	}
	//创建命令客户端
	for (int i = 0; i < IPNum; i++)
	{
		const char* ccIP = CString2ConstChar(IPValue.at(i));
		if (!create_slave_cmd_client(ccIP))
		{
			IPValue.erase(IPValue.begin() + i);
			IPNum = IPValue.size();
			i--;
		}
		delete[] ccIP;
	}
	if (IPNum <= 0)
	{
		return 2;//创建命令客户端失败
	}

	destory_slave_cmd_client();

	char buf[30] = "";
	if (!WritePrivateProfileString(_T("CutterServer"), _T("IP2"), IPValue.at(0), m_ConfigPath))
	{
		return 3;
	}
	return 0;
}