栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

自用根据ip返回同网段网卡的mac地址

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自用根据ip返回同网段网卡的mac地址

bool  IpInSubnet(std::string pcIp1, std::string pcIp2, std::string pcSubNetworkMask)
{
	int ip1[4] = { 0 };
	int ip2[4] = { 0 };
	int ip3[4] = { 0 };
	sscanf_s(pcIp1.c_str(), "%d.%d.%d.%d", &ip1[0], &ip1[1], &ip1[2], &ip1[3]);
	sscanf_s(pcIp2.c_str(), "%d.%d.%d.%d", &ip2[0], &ip2[1], &ip2[2], &ip2[3]);
	sscanf_s(pcSubNetworkMask.c_str(), "%d.%d.%d.%d", &ip3[0], &ip3[1], &ip3[2], &ip3[3]);
	for (int i = 0; i < 4; i++)
	{
		if (ip1[i] < 0 || ip1[i]>255 || ip2[i] < 0 || ip2[i]>255 || ip3[i] < 0 || ip3[i]>255)
		{
			return FALSE;
		}
	}
	return (ip1[0] & ip3[0]) == (ip2[0] & ip3[0]) && (ip1[1] & ip3[1]) == (ip2[1] & ip3[1]) && (ip1[2] & ip3[2]) == (ip2[2] & ip3[2]) && (ip1[3] & ip3[3]) == (ip2[3] & ip3[3]);
}
bool CheckIpInSubnet(std::string ip, PIP_ADAPTER_INFO cur)
{
	IP_ADDR_STRING* pIpAddrString = &(cur->IpAddressList);
	IP_ADDR_STRING* pGateway = &(cur->GatewayList);
	printf("IP:%srn", pIpAddrString->IpAddress.String);
	printf("子网掩码:%srn", pIpAddrString->IpMask.String);
	printf("网关:%srn", pGateway->IpAddress.String);
	if (IpInSubnet(pIpAddrString->IpAddress.String, ip, pIpAddrString->IpMask.String))
	{
		return TRUE;
	}
	return FALSE;
}
std::string GetMacBySubnet(std::string ip)
{
	std::string mac = "";
	bool found = FALSE;
	bool bgetETH0info = FALSE;
	PIP_ADAPTER_INFO pIpAdapterInfo = (PIP_ADAPTER_INFO)malloc(sizeof(IP_ADAPTER_INFO) * ADAPTERNUM);// new IP_ADAPTER_INFO[ADAPTERNUM];// 10个网卡空间 足够了 
	unsigned long stSize = sizeof(IP_ADAPTER_INFO) * ADAPTERNUM;
	// 获取所有网卡信息,参数二为输入输出参数 
	int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
	// 空间不足
	if (ERROR_BUFFER_OVERFLOW == nRel) {
		// 释放空间
		if (pIpAdapterInfo != NULL)
			free(pIpAdapterInfo);
		return mac;
	}
	PIP_ADAPTER_INFO cur = pIpAdapterInfo;
	// 多个网卡 通过链表形式链接起来的 
	while (cur) {
		printf("网卡描述:%srn", cur->Description);
		do {
			switch (cur->Type) {
			case MIB_IF_TYPE_OTHER:
				break;
			case MIB_IF_TYPE_ETHERNET:
			{
				if (CheckIpInSubnet(ip, cur))
				{
					found = TRUE;
				}
				break;
			}
			case MIB_IF_TYPE_TOKENRING:
				break;
			case MIB_IF_TYPE_FDDI:
				break;
			case MIB_IF_TYPE_PPP:
				break;
			case MIB_IF_TYPE_LOOPBACK:
				break;
			case MIB_IF_TYPE_SLIP:
				break;
			default://无线网卡,Unknown type
			{
				if (CheckIpInSubnet(ip, cur))
				{
					found = TRUE;
				}
				break;
			}
			}
		} while (false);
		char hex[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };

		// mac 地址一般6个字节 
		// mac 二进制转16进制字符串
		char macStr[18] = { 0 };//12+5+1
		int k = 0;
		for (int j = 0; j < cur->AddressLength; j++) {
			macStr[k++] = hex[(cur->Address[j] & 0xf0) >> 4];
			macStr[k++] = hex[cur->Address[j] & 0x0f];
			macStr[k++] = '-';
		}
		macStr[k - 1] = 0;

		printf("MAC:%srn", macStr);
		if (found&& mac.empty())
		{
			mac = macStr;
		}

		cur = cur->Next;
		printf("************************************************************************rn");
	}
	// 释放空间
	if (pIpAdapterInfo != NULL)
		free(pIpAdapterInfo);
	return mac;
}
int main()
{
	std::string mac = GetMacBySubnet("192.168.1.38");
	std::cout << "GetMacBySubnet is :=>" << mac << std::endl;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869880.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号