本地计算机网络信息的获取

http://blog.csdn.net/neicole/article/details/7583411

本地计算机网络信息的获取

 

一。这次的程序,主要实现下面功能:

功能的实现都非常简单,有五种函数可以直接调用:

1.用于获取本地网络适配器信息的函数:

     DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo,  PULONG pOutBufLen );

2.用于获取本地主机名、域名和DNS服务器信息的函数:

     DWORD GetNetworkParamsInfo(PFIXED_INFO pFixedInfo, PULONG pOutBufLen );

3.用于获取本地计算机网络接口数量的函数

     DWORD GetNumberOfInterfaces(PDWORD pdwNumIf);

4.用于获取本地主机名、域名和DNS服务器信息的函数

     DWORD GetInterfaceInfo(PIP_INTERFACE_INFO pIfTable,         PULONG dwOutBufLen );

5.获取本地计算机IP地址表的函数

     DWORD GetIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, BOOL bOrder );

 

二。下面是程序执行效果图

 

 

三。源代码

  1. // getNativeComputerNetInformation.cpp  
  2.   
  3. #include <stdio.h>  
  4. #include <WinSock2.h>  
  5. #include <iphlpapi.h>  
  6.   
  7. #pragma comment(lib, "IPHLPAPI.lib")  
  8. #pragma comment(lib, "ws2_32.lib")  
  9.   
  10. int main()  
  11. {  
  12. // 各类函数声明  
  13.     int GetAdaptersInfoFunction();          // 获取本地网络适配器信息的函数  
  14.     int GetNetworkParamsFunction();         // 获取本地主机名、域名和DNS服务器信息  
  15.     int GetInterfacesFunction();            // 获取本地计算机网络接口的基本信息  
  16.     int GetIpAddrTableFunction();           // 获取本地计算机的IP地址  
  17.   
  18.   
  19. // 各类函数调用  
  20.     char choice;  
  21.     do{  
  22.         system("cls");  
  23.         printf("1.获取本地网络适配器信息的函数 GetAdaptersInfoFunction();\n");  
  24.         printf("2.获取本地主机名、域名和DNS服务器信息 GetNetworkParamsFunction();\n");  
  25.         printf("3.获取本地计算机网络接口的基本信息 GetInterfacesFunction();\n");  
  26.         printf("4.获取本地计算机的IP地址 GetIpAddrTableFunction();\n");  
  27.         printf("0.退出程序\n");  
  28.         printf("请输入需要调用的函数:");  
  29.         scanf("%c", &choice);  
  30.         printf("\n\n");  
  31.         switch(choice){  
  32.             case '0'break;  
  33.             case '1':   GetAdaptersInfoFunction(); break;  
  34.             case '2': GetNetworkParamsFunction(); break;  
  35.             case '3': GetInterfacesFunction(); break;  
  36.             case '4': GetIpAddrTableFunction(); break;  
  37.             defaultbreak;  
  38.         }  
  39.     }while('0' != choice);  
  40.   
  41.     return 0;  
  42. }  
  43.       
  44.   
  45. /** 
  46.  * 用于获取本地网络适配器信息的函数: 
  47.  * DWORD GetAdaptersInfo( 
  48.  *   _in PIP_ADAPTER_INFO pAdapterInfo;    // 结构体保存获取到的网络适配器的信息 
  49.  *   _out PULONG pOutBufLen                // 保存pAdapterInfo缓冲区的大小 
  50.  * ); 
  51.  * 
  52.  * 网络适配器的信息的结构体: 
  53.  * typedef struct _IP_ADAPTER_INFO { 
  54.  *   struct _IP_ADAPTER_INFO* Next;                 // 指定网络适配器链表中的下一个网络适配器 
  55.  *   DWORD ComboIndex;                              // 预留变量 
  56.  *   char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; // 网络适配器的名称 
  57.  *   char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];  // 网络适配器的描述信息 
  58.  *   UINT AddressLength;                            // 网络适配器MAC的长度 
  59.  *   BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];      // 网络适配器的MAC地址 
  60.  *   DWORD Index;                                   // 网络适配器索引(重启计算机会改变的值) 
  61.  *   UINT Type;                                     // 网络适配器的类型 
  62.  *   UINT DhcpEnabled;                              // 指定该网络适配器上是否启用了DHCP 
  63.  *   PIP_ADDR_STRING CurrentIpAddress;              // 预留变量 
  64.  *   IP_ADDR_STRING IpAddressList;                  // 与此网络适配器上相关联的IP地址列表 
  65.  *   IP_ADDR_STRING GatewayList;                    // 该网络适配器上定义的IP地址的默认网关 
  66.  *   IP_ADDR_STRING DhcpServer;                     // 该网络适配器上定义的DHCP服务器的IP地址 
  67.  *   BOOL HaveWins;                                 // 标明该网络适配器是否启用了WINS 
  68.  *   IP_ADDR_STRING PrimaryWinsServer;              // 主WIN服务器的IP地址 
  69.  *   IP_ADDR_STRING SecondaryWinsServer;            // 从WINS服务器的IP地址 
  70.  *   time_t LeaseObtained;                          // 当前的DHCP租借获取的时间,只有在启用DHCP时生效 
  71.  *   time_t LeaseExpires;                           // 当前的DHCP租借失败的时间,只有在启用DHCP时生效 
  72.  * } IP_ADAPTER_INFO, *PIP_ADAPTER_INFO; 
  73.  **/  
  74.   
  75. int GetAdaptersInfoFunction()   // 获取本地网络适配器信息的函数  
  76. {  
  77. // 变量声明   
  78.     IP_ADAPTER_INFO *pAdapterInfo;  // 指定获取到的网络信息结构体链表的指针  
  79.     ULONG ulOutBufLen;              // 获取到网络信息结构体链表的长度  
  80.     DWORD dwRetVal;                 // 返回调用编码  
  81.     PIP_ADAPTER_INFO pAdapter;  
  82.   
  83. // 获取本地网络适配器的信息  
  84.     // 为pAdapterINfo分配空间  
  85.     pAdapterInfo = (IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));  
  86.     ulOutBufLen = sizeof(IP_ADAPTER_INFO);  
  87.     // 需要两次调用GetAdaptersInfo()函数  
  88.     // 第1次调用GetAdaptersInfo(), 获取返回结果的大小保存到ulOutBufLen中  
  89.     // 因为网络信息结构体链表的默认长度是不知道的  
  90.     if(ERROR_SUCCESS != GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) ){  
  91.         free(pAdapterInfo);  
  92.         pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);  
  93.     }  
  94.     // 第2次调用GetAdaptersInfo(), 获取本地网络信息保存到结构体pAdapterInfo中  
  95.     if(ERROR_SUCCESS != (dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen))){  
  96.         printf("GetAdaptersInfo Error! &d\n", dwRetVal);  
  97.         exit(1);  
  98.     }  
  99.   
  100. // 显示本地网络适配器信息,从pAdapterInfo获取并显示本地网络信息  
  101.     pAdapter = pAdapterInfo;  
  102.     while(pAdapter){  
  103.         printf("网络适配器名: \t\t%s\n", pAdapter->AdapterName);  
  104.         printf("网络适配器描述: \t%s\n\n", pAdapter->Description);  
  105.         printf("MAC地址:\t\t");  
  106.         // 处理MAC地址  
  107.         for(unsigned int i = 0; i < pAdapter->AddressLength; ++i){  
  108.             if(i == (pAdapter->AddressLength -1 ) ){ // 最后一次输入换行  
  109.                 printf("%.2X\n", (int)pAdapter->Address[i]);  
  110.             }  
  111.             else{  
  112.                 printf("%.2X-", (int)pAdapter->Address[i]);  
  113.             }  
  114.         }  
  115.         printf("IP地址: \t\t%s\n", pAdapter->IpAddressList.IpAddress.String);  
  116.         printf("子网掩码: \t\t%s\n", pAdapter->IpAddressList.IpMask.String);  
  117.         printf("网关: \t\t\t%s\n", pAdapter->GatewayList.IpAddress.String);  
  118.         printf("---------------\n");  
  119.         if(pAdapter -> DhcpEnabled){ // 指定该网络适配器上是否启用了DHCP  
  120.             printf("启用DHCP: \t\t是\n");  
  121.             printf("DHCP服务器: \t\t%s\n", pAdapter->DhcpServer.IpAddress.String);  
  122.         }  
  123.         else{  
  124.             printf("启用DHCP: \t\t否\n");  
  125.         }  
  126.         // 处理下一个网络适配器  
  127.         pAdapter = pAdapter -> Next;  
  128.         if(pAdapter){  
  129.             printf("\n\n**************************************************************\n");  
  130.         }  
  131.     }  
  132.   
  133. // 释放资源  
  134.     if(pAdapterInfo){  
  135.         free(pAdapterInfo);  
  136.     }  
  137.      
  138.     printf("\n\n");  
  139.     system("pause");  
  140.     return 0;  
  141. }  
  142.   
  143. /** 
  144.  * 用于获取本地主机名、域名和DNS服务器信息的函数: 
  145.  * DWORD GetNetworkParamsInfo( 
  146.  *   _out PFIXED_INFO pFixedInfo;    // 使用FIXED_INFO结构体保存获取到的本地网络参数的信息 
  147.  *   _in PULONG pOutBufLen           // 保存pFixedInfo缓冲区的大小 
  148.  * ); 
  149.  * 
  150.  * 保存本地主机名、域名和DNS服务器信息的结构体: 
  151.  * typedef struct {  
  152.  *  char HostName[MAX_HOSTNAME_LEN + 4];      // 本地计算机的主机名 
  153.  *  char DomainName[MAX_DOMAIN_NAME_LEN + 4]; // 本地计算机注册到域的名称 
  154.  *  PIP_ADDR_STRING CurrentDnsServer;         // 预留变量 
  155.  *  IP_ADDR_STRING DnsServerList;             // 指定本地计算机上定义的DNS服务器列表 
  156.  *  UINT NodeType;                            // 本地计算机的节点类型 
  157.  *  char ScopeId[MAX_SCOPE_ID_LEN + 4];       // DHCP域名 
  158.  *  UINT EnableRouting;                       // 指定本地计算机是否启用了路由的功能 
  159.  *  UINT EnableProxy;                         // 指定本地计算机是否为ARP代理 
  160.  *  UINT EnableDns;                           // 指定本地计算机是否启用了DNS 
  161.  * } FIXED_INFO, *PFIXED_INFO; 
  162.  **/  
  163.   
  164. int GetNetworkParamsFunction() // 获取本地主机名、域名和DNS服务器信息  
  165. {         
  166. // 声明变量  
  167.     FIXED_INFO * FixedInfo;     // 定义保存本地计算机网络参数信息的结构体指针  
  168.     ULONG    ulOutBufLen;       // 保存获取到的本地计算机网络参数信息结构体链表的长度  
  169.     DWORD    dwRetVal;          // 调用GetNetworkParams()函数的返回值  
  170.     IP_ADDR_STRING * pIPAddr;   // 保存所有DNS服务器的IP地址列表  
  171.   
  172. // 获取信息  
  173.       
  174.     FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );   // 为FixedInfo结构体分配内存空间  
  175.     ulOutBufLen = sizeof( FIXED_INFO );         // 初始化ulOutBufLen变量值  
  176.       
  177.     // 第1次调用GetNetworkParams()函数,获取返回结果的大小到ulOutBufLen中  
  178.     if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( FixedInfo, &ulOutBufLen ) ) {  
  179.         GlobalFree( FixedInfo );  
  180.         FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen );  
  181.     }  
  182.   
  183.     // 第2次调用GetNetworkParams()函数,以前面获取的ulOutBufLen作为参数,  
  184.     if ( dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen ) != ERROR_SUCCESS) {  
  185.         printf( "调用GetNetworkParams()函数失败。返回值: %08x\n", dwRetVal );  
  186.     }  
  187.     else {  
  188.         printf( "主机名: %s\n", FixedInfo->HostName );  
  189.         printf( "域名: %s\n", FixedInfo->DomainName );  
  190.         printf("\n==========网络信息==========\n");   
  191.   
  192.          // 生成节点类型字符串  
  193.          char* NodeType;   
  194.          switch(FixedInfo->NodeType){   
  195.              case BROADCAST_NODETYPE:    NodeType = "Broadcase Node";  break;   
  196.              case PEER_TO_PEER_NODETYPE: NodeType = "Peer to Peer Node";  break;   
  197.              case MIXED_NODETYPE:   NodeType = "Mixed Node";  break;   
  198.              case HYBRID_NODETYPE:  NodeType = "Hybrid Node"break;   
  199.              default:   NodeType = "Unknown Node";  break;   
  200.          }   
  201.   
  202.         printf("节点类型...................:%d - %s\n", FixedInfo->NodeType, NodeType);   
  203.         printf("是否启用路由功能...........:%s\n", (FixedInfo->EnableRouting != 0) ? "是" : "否");   
  204.         printf("是否启用ARP代理功能........:%s\n", (FixedInfo->EnableProxy != 0) ? "是" : "否");   
  205.         printf("是否启用DNS服务器..........:%s\n", (FixedInfo->EnableDns != 0) ? "是" : "否");   
  206.   
  207.         printf( "\nDNS服务器列表:\n" );  
  208.         printf( "%s\n", FixedInfo->DnsServerList.IpAddress.String );  
  209.   
  210.         pIPAddr = FixedInfo->DnsServerList.Next;  
  211.         while ( pIPAddr ) {  
  212.             printf( "\t%s\n", pIPAddr->IpAddress.String );  
  213.             pIPAddr = pIPAddr->Next;  
  214.         }  
  215.     }  
  216.   
  217.     printf("\n");  
  218.     system("pause");     
  219.     return 0;  
  220. }  
  221.   
  222. /** 
  223.  * 用于获取本地计算机网络接口数量的函数 
  224.  * DWORD GetNumberOfInterfaces( 
  225.  *   _out PDWORD pdwNumIf 
  226.  * ); 
  227.  * 
  228.  * 用于获取本地主机名、域名和DNS服务器信息的函数 
  229.  * DWORD GetInterfaceInfo( 
  230.  *  _out PIP_INTERFACE_INFO pIfTable,   // 接受本地计算机网络接口基本信息的结构体IP_INTERFACE_INFO 
  231.  *  _inout PULONG dwOutBufLen           // 接到数据的大小 
  232.  * ); 
  233.  * 
  234.  * 用于保存计算机网络接口信息的结构体 
  235.  * typedfe struct _IP_ADAPTER_INDEX_MAP{ 
  236.  *  ULONG Index;                     // 网络适配器索引号 
  237.  *  WCHAR Name[MAX_ADAPTER_NAME];   // 网络适配器名称 
  238.  * }IP_INTERFACE_INDEX_MAP, *PIP_ADAPTER_INDEX_MAP;  
  239.  **/  
  240.   
  241. // 分配内存空间  
  242. #define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))   
  243. // 释放内存空间  
  244. #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))  
  245.   
  246. int GetInterfacesFunction() // 获取本地计算机网络接口的基本信息  
  247. {  
  248. // 获取网络接口的数量  
  249.     DWORD dwNumIf;      // 用于获取接口数量  
  250.     DWORD  dwRetVal;    // 返回值  
  251.     if(dwRetVal = GetNumberOfInterfaces(&dwNumIf) == NO_ERROR){  
  252.         printf("本地网络接口数量为: %d\n", dwNumIf);  
  253.     }  
  254.     else{  
  255.         printf("调用GetNumberOfInterfaces()函数时出现错误。\n");  
  256.     }  
  257.   
  258. // 获取网络接口的基本信息  
  259.     PIP_INTERFACE_INFO pInfo;   // 保存网络接口信息的结构体指针  
  260.     ULONG ulOutBufLen = 0;      // 保存获取数据的长度  
  261.     int iReturn = 1;            // 本函数的返回结果  
  262.   
  263.     // 第1次调用 GetInterfaceInfo,获取数据大小,保存到ulOutBufLen变量中  
  264.     dwRetVal = GetInterfaceInfo(NULL, &ulOutBufLen);  
  265.     if (dwRetVal == ERROR_INSUFFICIENT_BUFFER) {  
  266.         pInfo = (IP_INTERFACE_INFO *) MALLOC(ulOutBufLen);  
  267.         if (pInfo == NULL) {  
  268.             printf("无法分配GetInterfaceInfo函数需要的内存空间。\n");  
  269.             return 1;  
  270.         }  
  271.     }  
  272.     // 第2次调用GetInterfaceInfo函数,获取需要的实际数据  
  273.     dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);  
  274.     if (dwRetVal == NO_ERROR) {  
  275.         printf("网络适配器数量: %ld\n\n", pInfo->NumAdapters);  
  276.         for (int i = 0; i < (int) pInfo->NumAdapters; i++) {  
  277.             printf("网络适配器索引[%d]: %ld\n", i,  
  278.                    pInfo->Adapter[i].Index);  
  279.             printf("网络适配器名称[%d]: %ws\n\n", i,  
  280.                    pInfo->Adapter[i].Name);  
  281.         }  
  282.         iReturn = 0;  
  283.     } else if (dwRetVal == ERROR_NO_DATA) {  
  284.         printf  
  285.             ("本地计算机上没有支持IPv4的网络适配器。\n");  
  286.         iReturn = 0;  
  287.     } else {  
  288.         printf("GetInterfaceInfo调用失败: %d\n", dwRetVal);  
  289.         iReturn = 1;  
  290.     }  
  291.       
  292.     FREE(pInfo);    // 释放内存空间  
  293.     system("pause");  
  294.     return (iReturn);  
  295. }  
  296.   
  297.   
  298.   
  299. /**  
  300.  * 获取本地计算机IP地址表的函数 
  301.  * DWORD GetIpAddrTable( 
  302.  *   _out PMIB_IPADDRTABLE pIpAddrTable,  // 接受获取到的本地计算机网络接口和IP地址的映射表 
  303.  *   _inout PULONG pdwSize,               // 接收收到数据的大小 
  304.  *   _in BOOL bOrder                     // 获取到的映射表中是否按IP地址的升序排列 
  305.  * ); 
  306.  * 
  307.  * 用于保存IP地址表的PMIB_IPADDRTABLE结构体 
  308.  * typedef struct _MIB_IPADDRTABLE{ 
  309.  *   DWORD      dwNumEntries;                   // 表示映射表中记录的数量 
  310.  *   MIB_IPADDRROW table[ANY_SIZE];             // MIB_IPADDRROW结构体数组 
  311.  * }MIB_IPADDRTABLE, *PMIB_IPADDRTABLE; 
  312.  * 
  313.  * 用于保存IP地址的结构体 
  314.  * typedef struct _MIB_IPADDRROW{ 
  315.  *   DWORD dwAddr;   // 网络字节序格式的IP地址 
  316.  *   DWORD dwIndex;  // 与IP地址相关联的网络编号序号 
  317.  *   DWORD dwMask;   // 网络字节序的子网掩码 
  318.  *   DWORD dwBCastAddr;  // 网络字节序格式的广播地址 
  319.  *   DWORD dwReasmSize;  // 已收到的数据报重装后的最大长度 
  320.  *   unsigned short unusedl;  // 预留字段 
  321.  *   unsigned short wType;    // IP地址的类型或状态 
  322.  * }MIB_IPADDRROW, *PMIB_IPADDRROW; 
  323.  **/  
  324.   
  325. //#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))  
  326. //#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))  
  327.   
  328. int GetIpAddrTableFunction()  
  329. {  
  330.     PMIB_IPADDRTABLE pIPAddrTable;  // 网络接口与IP地址映射表  
  331.     DWORD dwSize = 0;   // 获取数据的大小  
  332.     DWORD dwRetVal = 0; // 调用GetIPAddrTable()函数的返回值  
  333.     IN_ADDR IPAddr;     // 保存IP地址的结构体  
  334.     LPVOID lpMsgBuf;    // 用于获取错误信息  
  335.   
  336.     // 分配内存空间  
  337.     pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));  
  338.     // 第1次调用GetIpAddrTable()函数,获取数据的大小到dwSize  
  339.     if (pIPAddrTable) {  
  340.         if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==  ERROR_INSUFFICIENT_BUFFER) {  
  341.             FREE(pIPAddrTable);  
  342.             pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);  
  343.   
  344.         }  
  345.         if (pIPAddrTable == NULL) {  
  346.             printf("GetIpAddrTable()函数内存分配失败\n");  
  347.             exit(1);  
  348.         }  
  349.     }  
  350.     // 第2次调用GetIpAddrTable()函数,获取实际数据  
  351.     if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) {   
  352.         printf("GetIpAddrTable()调用失败: %d\n", dwRetVal);  
  353.         if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL,   
  354.                    dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) & lpMsgBuf, 0, NULL)) {  
  355.             printf("\t错误信息: %s", lpMsgBuf);  
  356.             LocalFree(lpMsgBuf);  
  357.         }  
  358.         exit(1);  
  359.     }  
  360.   
  361.     printf("\t记录数量: %ld\n", pIPAddrTable->dwNumEntries);  
  362.     for (int i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {  
  363.         printf("\n\t接口序号[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);  
  364.         IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;  
  365.         printf("\tIP地址[%d]:     \t%s\n", i, inet_ntoa(IPAddr) );  
  366.         IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;  
  367.         printf("\t子网掩码[%d]:    \t%s\n", i, inet_ntoa(IPAddr) );  
  368.         IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;  
  369.         printf("\t广播地址[%d]:      \t%s (%ld%)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);  
  370.         printf("\t重组报文最大数量[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize);  
  371.         printf("\t类型和状态[%d]:", i);  
  372.         if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)       printf("\t主IP地址");  
  373.         if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)        printf("\t动态IP地址");  
  374.         if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)   printf("\t断开连接的接口对应的IP地址");  
  375.         if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)        printf("\t删除的IP地址");  
  376.         if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)       printf("\t临时地址");  
  377.         printf("\n");  
  378.     }  
  379.   
  380.     if (pIPAddrTable) {  
  381.         FREE(pIPAddrTable);  
  382.         pIPAddrTable = NULL;  
  383.     }  
  384.   
  385.     printf("\n");  
  386.     system("pause");  
  387.     return 0;  
  388. }  


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值