当前位置:   article > 正文

windows使用api接口添加路由_createipforwardentry

createipforwardentry

接口函数:

CreateIpForwardEntry

 

代码:

  1. #ifndef WIN32_LEAN_AND_MEAN
  2. #define WIN32_LEAN_AND_MEAN
  3. #endif
  4. #include <windows.h>
  5. #include <winsock2.h>
  6. #include <iphlpapi.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #pragma comment(lib, "iphlpapi.lib")
  10. #pragma comment(lib,"ws2_32.lib")
  11. /*
  12. 获取接口对应的十六进制的序号
  13. */
  14. ULONG getindex(const char* ip)
  15. {
  16. PIP_ADAPTER_INFO pinfo = NULL;
  17. unsigned long len = 0;
  18. unsigned long nError;
  19. nError = GetAdaptersInfo(pinfo, &len); //这里nError肯定是ERROR_BUFFER_OVERFLOW,但是                  //我们得到了要用多少长的字节来存它。
  20. pinfo = (PIP_ADAPTER_INFO)malloc(len);
  21. nError = GetAdaptersInfo(pinfo, &len);
  22. if (nError == 0)
  23. {
  24. PIP_ADAPTER_INFO adapterPointer = pinfo;
  25. while (adapterPointer != NULL)
  26. {
  27. PIP_ADDR_STRING ipAddressListPointer = &(adapterPointer->IpAddressList);
  28. while (ipAddressListPointer != NULL) {
  29. if (strcmp((char*)(ipAddressListPointer->IpAddress).String, ip) == 0)
  30. {
  31. return(adapterPointer->Index);
  32. }
  33. else {
  34. ipAddressListPointer = ipAddressListPointer->Next;
  35. }
  36. adapterPointer = adapterPointer->Next;
  37. }
  38. }
  39. //做相关的操作
  40. }
  41. else
  42. {
  43. if (nError == ERROR_NO_DATA) printf("请检查您的计算机是否安装了网卡");
  44. if (nError == ERROR_NOT_SUPPORTED) printf("请更新你的操作系统为Win98/Me/2000/XP/2003");
  45. }
  46. free(pinfo);
  47. }
  48. /*
  49. 添加路由函数
  50. 入参:主机IP,子网掩码,接口IP
  51. 主体逻辑:先获取路由表中默认路由的信息,
  52. 再将其中的主机IP、子网掩码、接口等替换成自己需要的,
  53. 再使用CreateIpForwardEntry函数进行添加。
  54. 注意,struct _MIB_IPFORWARDROW 这个结构体是路由信息的结构体
  55. */
  56. void addRoute(const char* dst_ip, const char* net_mask, const char* interface_ip)
  57. {
  58. PMIB_IPFORWARDTABLE pIpForwardTable = NULL;
  59. PMIB_IPFORWARDROW pRow = NULL;
  60. DWORD dwSize = 0;
  61. BOOL bOrder = FALSE;
  62. DWORD dwStatus = 0;
  63. unsigned int i;
  64. // Find out how big our buffer needs to be.
  65. dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
  66. if (dwStatus == ERROR_INSUFFICIENT_BUFFER) {
  67. // Allocate the memory for the table
  68. if (!(pIpForwardTable = (PMIB_IPFORWARDTABLE)malloc(dwSize))) {
  69. printf("Malloc failed. Out of memory.\n");
  70. return;
  71. }
  72. // Now get the table.
  73. dwStatus = GetIpForwardTable(pIpForwardTable, &dwSize, bOrder);
  74. }
  75. if (dwStatus != ERROR_SUCCESS) {
  76. printf("getIpForwardTable failed.\n");
  77. if (pIpForwardTable)
  78. free(pIpForwardTable);
  79. return;
  80. }
  81. for (i = 0; i < pIpForwardTable->dwNumEntries; i++)
  82. {
  83. if (pIpForwardTable->table[i].dwForwardDest == 0)
  84. {
  85. if (!pRow)
  86. {
  87. pRow = (PMIB_IPFORWARDROW)malloc(sizeof(MIB_IPFORWARDROW));
  88. if (!pRow)
  89. {
  90. printf("Malloc failed. Out of memory.\n");
  91. return;
  92. }
  93. // Copy the row
  94. memcpy(pRow, &(pIpForwardTable->table[i]), sizeof(MIB_IPFORWARDROW));
  95. }
  96. }
  97. }
  98. /*printf("dwForwardDest:%0x dwForwardMask:%0x dwForwardNextHop:%0x, dwForwardIfIndex:%0x\n",
  99. pIpForwardTable->table[1].dwForwardDest,
  100. pIpForwardTable->table[1].dwForwardMask,
  101. pIpForwardTable->table[1].dwForwardNextHop,
  102. pIpForwardTable->table[1].dwForwardIfIndex);*/
  103. pRow->dwForwardNextHop = inet_addr(interface_ip);
  104. pRow->dwForwardDest = inet_addr(dst_ip);
  105. pRow->dwForwardMask = inet_addr(net_mask);
  106. pRow->dwForwardIfIndex = getindex(interface_ip);
  107. // Create a new route entry for the default gateway.
  108. dwStatus = CreateIpForwardEntry(pRow);
  109. if (dwStatus == NO_ERROR)
  110. printf("Gateway changed successfully\n");
  111. else if (dwStatus == ERROR_INVALID_PARAMETER)
  112. printf("Invalid parameter.\n");
  113. else if (ERROR_ACCESS_DENIED == dwStatus)
  114. {
  115. printf("ERROR_ACCESS_DENIED\n");
  116. }
  117. else
  118. printf("Error: %d\n", dwStatus);
  119. // Free resources
  120. if (pIpForwardTable)
  121. free(pIpForwardTable);
  122. if (pRow)
  123. free(pRow);
  124. return;
  125. }
  126. int main()
  127. {
  128. addRoute("1.1.1.1", "255.255.255.255", "192.168.100.10");
  129. return 0;
  130. }

注意,程序执行时,需要使用管理员权限执行,否则执行可能不生效。

 

参考:

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

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/59031
推荐阅读
相关标签
  

闽ICP备14008679号