zoukankan      html  css  js  c++  java
  • lphlpapi iphelper新增/删除IP地址

    转自:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365801(v=vs.85).aspx
    
    #pragma comment(lib, "iphlpapi.lib")
    #pragma comment(lib, "ws2_32.lib")
    
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <iphlpapi.h>
    #include <stdio.h>
    
    #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
    #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
    
    /* Note: could also use malloc() and free() */
    
    int __cdecl main(int argc, char **argv)
    {
    
        /* Variables used by GetIpAddrTable */
        PMIB_IPADDRTABLE pIPAddrTable;
        DWORD dwSize = 0;
        DWORD dwRetVal = 0;
        IN_ADDR IPAddr;
        DWORD ifIndex;
    
        /* IPv4 address and subnet mask we will be adding */
        UINT iaIPAddress;
        UINT iaIPMask;
    
        /* Variables where handles to the added IP are returned */
        ULONG NTEContext = 0;
        ULONG NTEInstance = 0;
    
        /* Variables used to return error message */
        LPVOID lpMsgBuf;
    
        // Validate the parameters
        if (argc != 3) {
            printf("usage: %s IPAddress SubnetMask\n", argv[0]);
            exit(1);
        }
    
        iaIPAddress = inet_addr(argv[1]);
        if (iaIPAddress == INADDR_NONE) {
            printf("usage: %s IPAddress SubnetMask\n", argv[0]);
            exit(1);
        }
    
        iaIPMask = inet_addr(argv[2]);
        if (iaIPMask == INADDR_NONE) {
            printf("usage: %s IPAddress SubnetMask\n", argv[0]);
            exit(1);
        }
    
        // Before calling AddIPAddress we use GetIpAddrTable to get
        // an adapter to which we can add the IP.
        pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));
        if (pIPAddrTable == NULL) {
            printf("Error allocating memory needed to call GetIpAddrTable\n");
            exit (1);
        }
        else {
            dwSize = 0;
            // Make an initial call to GetIpAddrTable to get the
            // necessary size into the dwSize variable
            if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==
                ERROR_INSUFFICIENT_BUFFER) {
                FREE(pIPAddrTable);
                pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);
    
            }
            if (pIPAddrTable == NULL) {
                printf("Memory allocation failed for GetIpAddrTable\n");
                exit(1);
            }
        }
        // Make a second call to GetIpAddrTable to get the
        // actual data we want
        if ((dwRetVal = GetIpAddrTable(pIPAddrTable, &dwSize, 0)) == NO_ERROR) {
            // Save the interface index to use for adding an IP address
            ifIndex = pIPAddrTable->table[0].dwIndex;
            printf("\n\tInterface Index:\t%ld\n", ifIndex);
            IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[0].dwAddr;
            printf("\tIP Address:       \t%s (%lu%)\n", inet_ntoa(IPAddr),
                   pIPAddrTable->table[0].dwAddr);
            IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[0].dwMask;
            printf("\tSubnet Mask:      \t%s (%lu%)\n", inet_ntoa(IPAddr),
                   pIPAddrTable->table[0].dwMask);
            IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[0].dwBCastAddr;
            printf("\tBroadCast Address:\t%s (%lu%)\n", inet_ntoa(IPAddr),
                   pIPAddrTable->table[0].dwBCastAddr);
            printf("\tReassembly size:  \t%lu\n\n",
                   pIPAddrTable->table[0].dwReasmSize);
        } else {
            printf("Call to GetIpAddrTable failed with error %d.\n", dwRetVal);
            if (pIPAddrTable)
                FREE(pIPAddrTable);
            exit(1);
        }
    
        if (pIPAddrTable) {
            FREE(pIPAddrTable);
            pIPAddrTable = NULL;
        }
    
        if ((dwRetVal = AddIPAddress(iaIPAddress,
                                     iaIPMask,
                                     ifIndex,
                                     &NTEContext, &NTEInstance)) == NO_ERROR) {
            printf("\tIPv4 address %s was successfully added.\n", argv[1]);
        } else {
            printf("AddIPAddress failed with error: %d\n", dwRetVal);
    
            if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),       // Default language
                              (LPTSTR) & lpMsgBuf, 0, NULL)) {
                printf("\tError: %s", lpMsgBuf);
                LocalFree(lpMsgBuf);
                exit(1);
            }
        }
    
    // Delete the IP we just added using the NTEContext
    // variable where the handle was returned       
        if ((dwRetVal = DeleteIPAddress(NTEContext)) == NO_ERROR) {
            printf("\tIPv4 address %s was successfully deleted.\n", argv[1]);
        } else {
            printf("\tDeleteIPAddress failed with error: %d\n", dwRetVal);
            exit(1);
        }
    
        exit(0);
    }
    

  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/jerry1999/p/3677347.html
Copyright © 2011-2022 走看看