检测路由器网关,上网的网卡 MAC地址,ip地址。网关MAC地址。

Posted bywayboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检测路由器网关,上网的网卡 MAC地址,ip地址。网关MAC地址。相关的知识,希望对你有一定的参考价值。

1、关于默认网关的监测,通常情况下 使用 route PRINT -4 可以获取到默认网关,如果您有多个网卡且都连接到了路由 您会发现 有多个默认网关。而跳跃点数则是优先级。数字越小 优先级越高。


static void getIpAddressByIndex(DWORD ifIndex, char * ip)

	DWORD dwSize = 0, i =0;
	if(ERROR_INSUFFICIENT_BUFFER == GetIpAddrTable(NULL, &dwSize,TRUE))
	
		PMIB_IPADDRTABLE pIPAddrTable = (PMIB_IPADDRTABLE)GlobalAlloc(GPTR, dwSize);
		if(GetIpAddrTable(pIPAddrTable, &dwSize, FALSE) == NO_ERROR)
		
			for(i =0; i < pIPAddrTable->dwNumEntries; i++)
			
				if(ifIndex == pIPAddrTable->table[i].dwIndex)
				
					struct in_addr gateway;
					gateway.s_addr = pIPAddrTable->table[i].dwAddr;
					if(NULL != ip)
						strcpy(ip, inet_ntoa(gateway));
				
			
		

		GlobalFree(pIPAddrTable);
	

/*
	获取默认网关IP地址, 以及最近的网络接口索引.
	返回值: 成功返回 真, 失败返回假
*/
BOOL GetDefaultGateWay(char * sGateWay, char * ipAddress)

	PMIB_IPFORWARDTABLE pIpRouteTable = NULL;
	DWORD dwActualSize = 0, i = 0, mIfIndex = 0;
	if(ERROR_INSUFFICIENT_BUFFER == GetIpForwardTable(pIpRouteTable, &dwActualSize,TRUE))
	
		pIpRouteTable = (PMIB_IPFORWARDTABLE)GlobalAlloc(GPTR, dwActualSize);
		if(GetIpForwardTable(pIpRouteTable, &dwActualSize, TRUE) == NO_ERROR)
		
			DWORD MinMetric = 0x7FFFFFFF, tableIndex = 0;
			MIB_IPFORWARDROW * table = NULL;

			// 遍历 查找跳跃点数最小的默认网关.
			for (i = 0; i < pIpRouteTable->dwNumEntries; i++)
			
				DWORD dwCurrIndex  = pIpRouteTable->table[i].dwForwardIfIndex;

				if(0x00 == pIpRouteTable->table[i].dwForwardMask && 0x00 == pIpRouteTable->table[i].dwForwardDest && pIpRouteTable->table[i].dwForwardProto == 3)
				
					if(pIpRouteTable->table[i].dwForwardMetric1 < MinMetric)
					
						MinMetric = pIpRouteTable->table[i].dwForwardMetric1;
						tableIndex = i;
					
				
			


			if(0x7FFFFFFF != MinMetric)
			
				struct in_addr gateway;
				table =  &pIpRouteTable->table[tableIndex]; 
				gateway.s_addr = table->dwForwardNextHop;

				if(NULL != sGateWay)
					strcpy(sGateWay, inet_ntoa(gateway));
				if(NULL != ipAddress)
					getIpAddressByIndex(table->dwForwardIfIndex, ipAddress);
				GlobalFree(pIpRouteTable);
				return TRUE;
			
		
		GlobalFree(pIpRouteTable);
	
	return FALSE;

2、获取路由器mac地址。

    得到网关地址了。接下来可以使用SendARP 函数来获取MAC地址。

static void CheckGateWayMac(client_config_t * _cfg)

	unsigned char gateway_mac[6]=0;
	ULONG   ulen=6;
	IPAddr destIP=inet_addr(_cfg->gateway);

	if(NO_ERROR==SendARP(destIP, NULL, (PULONG)gateway_mac, &ulen))
	
		sprintf(_cfg->gateway_mac, "%02X:%02X:%02X:%02X:%02X:%02X", gateway_mac[0],gateway_mac[1],gateway_mac[2],gateway_mac[3],gateway_mac[4],gateway_mac[5]);
		
		update_networkenv(FALSE);
	

3、获取本机网卡的MAC地址。

   有本地IP地址了。可以通过遍历网卡来获取本机MAC。 待续。

BOOL getAdapterInfo()

	ULONG            cbBuf    = 0;
    PIP_ADAPTER_INFO pAdapter = NULL;
    PIP_ADAPTER_INFO pMemory  = NULL;
    DWORD            dwResult = 0;
	DWORD			 ifIndex  = 0;

	char m_gateway[17], m_ipaddress[17];

	// 这里是检测网关.
	if(FALSE == GetDefaultGateWay(m_gateway, m_ipaddress, &ifIndex))
	
		return FALSE;
	

	if(SOCKET_ERROR != gethostname(_cfg.host_name, MAX_HOSTNAME_LEN))
	
		//成功
		
		dwResult = GetAdaptersInfo(NULL, &cbBuf);
		if(ERROR_BUFFER_OVERFLOW == dwResult)
		
			pMemory = pAdapter = (PIP_ADAPTER_INFO) malloc(cbBuf > sizeof(IP_ADAPTER_INFO)? cbBuf: sizeof(IP_ADAPTER_INFO));
			if(NO_ERROR == GetAdaptersInfo(pAdapter, &cbBuf))
			
				while (pAdapter)
				
					
					if(ifIndex == pAdapter->Index)
					
						//找到了网卡接口MAC
						sprintf(_cfg.mac_address,"%02X:%02X:%02X:%02X:%02X:%02X", 
							pAdapter->Address[0],pAdapter->Address[1],pAdapter->Address[2],pAdapter->Address[3],pAdapter->Address[4],pAdapter->Address[5]);
						
						// 保存网关和IP地址到配置文件.
						strcpy(_cfg.gateway, m_gateway);
						strcpy(_cfg.ip_address, m_ipaddress);
						CheckGateWayMac(&_cfg); // 获取网关MAC
						
						free(pMemory);
						return TRUE;
					
					
					pAdapter = pAdapter->Next;				
				
				free(pMemory);
			
		
		
		return FALSE;
		
	else
		printf("ERROR:%d\\n",GetLastError());
	
	return FALSE;



以上是关于检测路由器网关,上网的网卡 MAC地址,ip地址。网关MAC地址。的主要内容,如果未能解决你的问题,请参考以下文章

请问移动光纤怎么连接路由器?无法获得公网IP地址、掩码和网关、DNS信息

如何获得正确的网关MAC地址???

连接wifi的主机设置静态ip(固定ip)后无法上网的原因

怎样绕过ip限制?

不同局域网内2个电脑MAC地址一样,会影响上网吗?

server2012未识别的网络