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

📄 iphlpapi.h

📁 关于ARP的一个详细的源代码
💻 H
字号:
//////////////////////////////////////////////////
// iphlpapi.h文件
//

/**++

修改自 Borland C++ 中的iphlpapi.h文件
    因为VC++ 6.0 不支持这些函数
    
--*/

#define MAX_ADAPTER_DESCRIPTION_LENGTH  128 // arb.
#define MAX_ADAPTER_NAME_LENGTH         256 // arb.
#define MAX_ADAPTER_ADDRESS_LENGTH      8   // arb.
#define MAXLEN_PHYSADDR 8

//
// IP_ADDRESS_STRING - store an IP address as a dotted decimal string
//

typedef struct {
    char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;

//
// IP_ADDR_STRING - store an IP address with its corresponding subnet mask,
// both as dotted decimal strings
//

typedef struct _IP_ADDR_STRING {
    struct _IP_ADDR_STRING* Next;
    IP_ADDRESS_STRING IpAddress;
    IP_MASK_STRING IpMask;
    DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;

//
// ADAPTER_INFO - per-adapter information. All IP addresses are stored as
// strings
//

typedef struct _IP_ADAPTER_INFO {
    struct _IP_ADAPTER_INFO* Next;
    DWORD ComboIndex;
    char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
    char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
    UINT AddressLength;
    BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
    DWORD Index;
    UINT Type;
    UINT DhcpEnabled;
    PIP_ADDR_STRING CurrentIpAddress;
    IP_ADDR_STRING IpAddressList;
    IP_ADDR_STRING GatewayList;
    IP_ADDR_STRING DhcpServer;
    BOOL HaveWins;
    IP_ADDR_STRING PrimaryWinsServer;
    IP_ADDR_STRING SecondaryWinsServer;
    time_t LeaseObtained;
    time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

typedef struct _MIB_IPNETROW
{
    DWORD		dwIndex;
    DWORD		dwPhysAddrLen;
    BYTE		bPhysAddr[MAXLEN_PHYSADDR];
    DWORD		dwAddr;
    DWORD		dwType;
} MIB_IPNETROW, *PMIB_IPNETROW;

typedef struct _MIB_IPFORWARDROW
{
    DWORD		dwForwardDest;
    DWORD		dwForwardMask;
    DWORD		dwForwardPolicy;
    DWORD		dwForwardNextHop;
    DWORD		dwForwardIfIndex;
    DWORD		dwForwardType;
    DWORD		dwForwardProto;
    DWORD		dwForwardAge;
    DWORD       dwForwardNextHopAS;
    DWORD		dwForwardMetric1;
    DWORD		dwForwardMetric2;
    DWORD		dwForwardMetric3;
    DWORD		dwForwardMetric4;
    DWORD		dwForwardMetric5;
}MIB_IPFORWARDROW, *PMIB_IPFORWARDROW;


typedef unsigned long   IPAddr;     // An IP address.


typedef DWORD (CALLBACK * CRIPENY) (IN PMIB_IPNETROW pArpEntry); // CreateIpNetEntry
typedef DWORD (CALLBACK * SENDARP) (IPAddr, IPAddr, PULONG,PULONG); // SendARP
typedef DWORD (CALLBACK * GBESTRT) (IN  DWORD, IN  DWORD, OUT PMIB_IPFORWARDROW); // GetBestRoute
typedef DWORD (CALLBACK * PGAINFO) (PIP_ADAPTER_INFO,PULONG); //GetAdaptersInfo

HINSTANCE hInst = LoadLibrary("iphlpapi.dll");
CRIPENY CreateIpNetEntry = (CRIPENY) GetProcAddress(hInst,"CreateIpNetEntry");
GBESTRT GetBestRoute = (GBESTRT) GetProcAddress(hInst,"GetBestRoute");
PGAINFO GetAdaptersInfo=(PGAINFO) GetProcAddress(hInst,"GetAdaptersInfo");
SENDARP SendARP = (SENDARP) GetProcAddress(hInst,"SendARP");

//
// 表态绑定ARP函数,操作ARP表
//

BOOL StaticARP(unsigned char szIPAddr[], BYTE bPhysAddr[])
{
	MIB_IPFORWARDROW ipfrow;
	MIB_IPNETROW iprow;
	DWORD dwIPAddr = inet_addr((char *) szIPAddr);
	if (GetBestRoute(dwIPAddr, ADDR_ANY, &ipfrow) != NO_ERROR)
		return (-1);
	memset(&iprow, 0, sizeof(iprow));
	iprow.dwIndex = ipfrow.dwForwardIfIndex;
	iprow.dwPhysAddrLen = 6;
	memcpy(iprow.bPhysAddr, bPhysAddr, 6);
	iprow.dwAddr = dwIPAddr;
	iprow.dwType = 4;	/* - static */

	if (CreateIpNetEntry(&iprow) != NO_ERROR)
		return TRUE;
	return FALSE;
}

//
// 由网卡的名子得到网卡地址相关信息,IP地址、网卡地址、网关IP地址
// 入口参数: 网卡ID ListAdapter()所得
// 出口参数: szIPAddr ==> 自身IP地址 ucPhysical ==> 网卡地址 szGateIPAddr ==> 网关地址 
//

BOOL Getadapterbyname(char szAdapterName[], char szIPAddr[],
					  unsigned char ucPhysicalAddr[],  char szGateIPAddr[])
{
	PIP_ADAPTER_INFO pInfo = NULL, pInfoTemp = NULL;
	ULONG ulSize = 0;
	GetAdaptersInfo(pInfo, &ulSize); // First call get buff size
	pInfo = (PIP_ADAPTER_INFO) new(char[ulSize]);
	GetAdaptersInfo(pInfo, &ulSize);
	while(pInfo)
	{
		if (strcmp(szAdapterName, pInfo->AdapterName) ==0)
		{
			
			for(int i=0; i < (int)pInfo->AddressLength; i++)
				ucPhysicalAddr[i] = pInfo->Address[i];
			// Get Last Ip Address To szIPAddr
			PIP_ADDR_STRING pAddTemp=&(pInfo->IpAddressList);
			while(pAddTemp)
			{
				strcpy(szIPAddr,pAddTemp->IpAddress.String);
				pAddTemp=pAddTemp->Next;
			}
			if (strlen(pInfo->GatewayList.IpAddress.String) > 0)
				strcpy(szGateIPAddr, pInfo->GatewayList.IpAddress.String);
			else
				strcpy(szGateIPAddr, "N/A"); // Not Applicable
			return TRUE;
		}
		pInfo = pInfo->Next; 
	}
	delete pInfo;
	return FALSE;
}

⌨️ 快捷键说明

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