windows使用api接口添加路由

接口函數:

CreateIpForwardEntry

 

代碼:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib,"ws2_32.lib")

/*
獲取接口對應的十六進制的序號
*/
ULONG getindex(const char* ip)
{

	PIP_ADAPTER_INFO pinfo = NULL;
	unsigned long len = 0;
	unsigned long nError;
	nError = GetAdaptersInfo(pinfo, &len); //這裏nError肯定是ERROR_BUFFER_OVERFLOW,但是                  //我們得到了要用多少長的字節來存它。
	pinfo = (PIP_ADAPTER_INFO)malloc(len);
	nError = GetAdaptersInfo(pinfo, &len);

	if (nError == 0)
	{
		PIP_ADAPTER_INFO adapterPointer = pinfo;
		while (adapterPointer != NULL)
		{
			PIP_ADDR_STRING ipAddressListPointer = &(adapterPointer->IpAddressList);
			while (ipAddressListPointer != NULL) {
				if (strcmp((char*)(ipAddressListPointer->IpAddress).String, ip) == 0)
				{
					return(adapterPointer->Index);
				}
				else {
					ipAddressListPointer = ipAddressListPointer->Next;
				}
				adapterPointer = adapterPointer->Next;
			}
		}
		//做相關的操作
	}
	else
	{
		if (nError == ERROR_NO_DATA) printf("請檢查您的計算機是否安裝了網卡");
		if (nError == ERROR_NOT_SUPPORTED) printf("請更新你的操作系統爲Win98/Me/2000/XP/2003");
	}
	free(pinfo);
}

/*
添加路由函數
入參:主機IP,子網掩碼,接口IP
主體邏輯:先獲取路由表中默認路由的信息,
再將其中的主機IP、子網掩碼、接口等替換成自己需要的,
再使用CreateIpForwardEntry函數進行添加。
注意,struct _MIB_IPFORWARDROW 這個結構體是路由信息的結構體
*/
void addRoute(const char* dst_ip, const char* net_mask, const char* interface_ip)
{
	PMIB_IPFORWARDTABLE pIpForwardTable = NULL;
	PMIB_IPFORWARDROW pRow = NULL;
	DWORD dwSize = 0;
	BOOL bOrder = FALSE;
	DWORD dwStatus = 0;

	unsigned int i;

	// Find out how big our buffer needs to be.
	dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
	if (dwStatus == ERROR_INSUFFICIENT_BUFFER) {
		// Allocate the memory for the table
		if (!(pIpForwardTable = (PMIB_IPFORWARDTABLE)malloc(dwSize))) {
			printf("Malloc failed. Out of memory.\n");
			return;
		}
		// Now get the table.
		dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
	}

	if (dwStatus != ERROR_SUCCESS) {
		printf("getIpForwardTable failed.\n");
		if (pIpForwardTable)
			free(pIpForwardTable);
		return;
	}

	for (i = 0; i < pIpForwardTable->dwNumEntries; i++)
	{
		if (pIpForwardTable->table[i].dwForwardDest == 0)
		{
			if (!pRow)
			{
				pRow = (PMIB_IPFORWARDROW)malloc(sizeof(MIB_IPFORWARDROW));
				if (!pRow) 
				{
					printf("Malloc failed. Out of memory.\n");
					return;
				}
				// Copy the row
				memcpy(pRow, &(pIpForwardTable->table[i]), sizeof(MIB_IPFORWARDROW));
			}
		}
	}
	/*printf("dwForwardDest:%0x dwForwardMask:%0x dwForwardNextHop:%0x, dwForwardIfIndex:%0x\n",
		pIpForwardTable->table[1].dwForwardDest,
		pIpForwardTable->table[1].dwForwardMask,
		pIpForwardTable->table[1].dwForwardNextHop,
		pIpForwardTable->table[1].dwForwardIfIndex);*/

	pRow->dwForwardNextHop = inet_addr(interface_ip);
	pRow->dwForwardDest = inet_addr(dst_ip);
	pRow->dwForwardMask = inet_addr(net_mask);
	pRow->dwForwardIfIndex = getindex(interface_ip);

	// Create a new route entry for the default gateway.
	dwStatus = CreateIpForwardEntry(pRow);

	if (dwStatus == NO_ERROR)
		printf("Gateway changed successfully\n");
	else if (dwStatus == ERROR_INVALID_PARAMETER)
		printf("Invalid parameter.\n");
	else if (ERROR_ACCESS_DENIED == dwStatus)
	{
		printf("ERROR_ACCESS_DENIED\n");
	}
	else
		printf("Error: %d\n", dwStatus);

	// Free resources
	if (pIpForwardTable)
		free(pIpForwardTable);
	if (pRow)
		free(pRow);

	return;
}
int main()
{
	addRoute("1.1.1.1", "255.255.255.255", "192.168.100.10");
	return 0;
}

注意,程序執行時,需要使用管理員權限執行,否則執行可能不生效。

 

參考:

https://docs.microsoft.com/zh-cn/windows/win32/api/iphlpapi/nf-iphlpapi-createipforwardentry

https://docs.microsoft.com/zh-cn/windows/win32/api/ipmib/ns-ipmib-mib_ipforwardrow

https://bbs.csdn.net/topics/360168672?list=lz

https://bbs.csdn.net/topics/390169429#post-392113140

https://bbs.csdn.net/topics/390321525?page=1

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章