首先,这篇文章实现了两种方法查询IP,实现截图如下:

第一种方法时调用系统命令,代码如下:

#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
system("ipconfig");
system("PAUSE");
return EXIT_SUCCESS;
}

下面这种方法是对源码的解析:

#include <windows.h>
#include <IPHlpApi.h>
#include <stdio.h>
#include <time.h>
#include<Ipexport.h>
#include<Windns.h>
#pragma comment(lib,"Ws2_32")
#pragma comment(lib,"Dnsapi")
#define Max 10 ;
//#include <winsock2.h>
#pragma comment(lib,"IPHlpApi")
void DoUsage(bool);
void DoRelease(bool);// realized
void DoRenew(bool);//realized
void DoDisplayDns(bool);
void DoFlushDns(bool);
void DoAll(void);
void GetInterfaceInfo(void);
//LPCTSTR GetNodeTypeName(UINT nodeType);
//LPCTSTR GetInterfaceTypeName(UINT InterfaceType);
IP_ADAPTER_INDEX_MAP adapterInfo;
PIP_INTERFACE_INFO pInfo;
DWORD checkReturn;
void main(int argc,char **argv)
{
bool doUsage=false;
bool doAll=false;
bool doRelease=false;
bool doRenew=false;
bool doDisplayDns=false;
bool doFlushDns=false;
char *argument; //store the command line code
argument=&argv[][]; if((argc>)&&(argv[][]=='/'))
{
if(!strcmp(argument,"?"))
{
doUsage=true;
DoUsage(doUsage);
}
if(!strcmp(argument,"all"))
{
doUsage=true;
DoAll(); } if(!strcmp(argument,"release"))
{
doRelease=true;
DoRelease(doRelease);
} if(!strcmp(argument,"renew"))
{
doRenew=true;
DoRenew(doRenew); } if(!strcmp(argument,"displaydns"))
{
doDisplayDns=true;
DoDisplayDns(doDisplayDns); } if(!strcmp(argument,"flushdns"))
{
doFlushDns=true;
DoFlushDns(doFlushDns); } }
else
printf("error command code!");
printf("......................................"); } /* get the using adapter information*/ void GetInterfaceInfo()
{ ULONG outBufferLen=;
pInfo=(IP_INTERFACE_INFO *)malloc(sizeof(IP_INTERFACE_INFO));
/* Make the first call to buffer information*/
if((checkReturn=GetInterfaceInfo(pInfo,&outBufferLen))==ERROR_INSUFFICIENT_BUFFER)
{
free(pInfo);
pInfo=(IP_INTERFACE_INFO *)malloc(outBufferLen); } /* Make the second call of GetInterfaceInfo() to get the actual data */ if((checkReturn=GetInterfaceInfo(pInfo,&outBufferLen))==NO_ERROR)
{
adapterInfo=pInfo->Adapter[];//关键此处返回IP_ADAPTER_INDEX_MAP 用于IP更新
printf("the dapter name is: %d ",pInfo->Adapter[].Name); }
else
{ printf("Get the interface information occer error!"); } } /* release IP address */ void DoRelease(bool doRelease)
{
if(doRelease)
{ GetInterfaceInfo();
/**the specific action to config/release*/
if((checkReturn=IpReleaseAddress(&adapterInfo))==NO_ERROR)
{
printf("the action of release IP work!");
}
else
printf("An error occured while releasing interface of %s",pInfo->Adapter[].Name); }
else
{
printf("illegal action"); } } /** Do renew IPAddree */ void DoRenew(bool doRenew)
{ if(doRenew)
{
GetInterfaceInfo(); if((checkReturn=IpRenewAddress(&adapterInfo))==NO_ERROR)
{
printf("the action of release IP work!");
}
else
printf("An error occured while releasing interface of %s",pInfo->Adapter[].Name); } else
{
printf("illegal action"); }
} /* display all information ipconfig/all */ void DoAll(void) { DWORD returnCheckError;
PFIXED_INFO pFixedInfo;
DWORD FixedInfoSize = ; PIP_ADDR_STRING pAddrStr;
PIP_ADAPTER_INFO pAdapt,pAdapterInfo; if ((returnCheckError = GetNetworkParams(NULL, &FixedInfoSize)) != )
{
if (returnCheckError != ERROR_BUFFER_OVERFLOW)
{
printf("GetNetworkParams sizing failed with error %d\n", returnCheckError);
return;
}
} // Allocate memory from sizing information
if ((pFixedInfo = (PFIXED_INFO) malloc( FixedInfoSize)) == NULL)
{
printf("Memory allocation error\n");
return;
} if ((returnCheckError = GetNetworkParams(pFixedInfo, &FixedInfoSize)) == )
{
printf("\tHost Name . . . . . . . . . : %s\n", pFixedInfo->HostName);
printf("\tDNS Servers . . . . . . . . : %s\n", pFixedInfo->DnsServerList.IpAddress.String);
pAddrStr = pFixedInfo->DnsServerList.Next;
while(pAddrStr)
{
printf("%52s\n", pAddrStr->IpAddress.String);
pAddrStr = pAddrStr->Next;
} printf("\tNode Type . . . . . . . . . : ");
switch (pFixedInfo->NodeType)
{
case :
printf("%s\n", "Broadcast");
break;
case :
printf("%s\n", "Peer to peer");
break;
case :
printf("%s\n", "Mixed");
break;
case :
printf("%s\n", "Hybrid");
break;
default:
printf("\n");
} printf("\tNetBIOS Scope ID. . . . . . : %s\n", pFixedInfo->ScopeId);
printf("\tIP Routing Enabled. . . . . : %s\n", (pFixedInfo->EnableRouting ? "yes" : "no"));
printf("\tWINS Proxy Enabled. . . . . : %s\n", (pFixedInfo->EnableProxy ? "yes" : "no"));
printf("\tNetBIOS Resolution Uses DNS : %s\n", (pFixedInfo->EnableDns ? "yes" : "no"));
} else
{
printf("GetNetworkParams failed with error %d\n", returnCheckError);
return;
} //
// Enumerate all of the adapter specific information using the IP_ADAPTER_INFO structure.
// Note: IP_ADAPTER_INFO contains a linked list of adapter entries. ULONG AdapterInfoSize = ;
if ((returnCheckError = GetAdaptersInfo(NULL, &AdapterInfoSize)) != )
{
if (returnCheckError != ERROR_BUFFER_OVERFLOW)
{
printf("GetAdaptersInfo sizing failed with error %d\n", returnCheckError);
return;
}
} // Allocate memory from sizing information
if ((pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL)
{
printf("Memory allocation error\n");
return;
} // Get actual adapter information
if ((returnCheckError = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != )
{
printf("GetAdaptersInfo failed with error %d\n", returnCheckError);
return;
} pAdapt = pAdapterInfo; while (pAdapt)
{
switch (pAdapt->Type)
{
case MIB_IF_TYPE_ETHERNET:
printf("\nEthernet adapter ");
break;
case MIB_IF_TYPE_TOKENRING:
printf("\nToken Ring adapter ");
break;
case MIB_IF_TYPE_FDDI:
printf("\nFDDI adapter ");
break;
case MIB_IF_TYPE_PPP:
printf("\nPPP adapter ");
break;
case MIB_IF_TYPE_LOOPBACK:
printf("\nLoopback adapter ");
break;
case MIB_IF_TYPE_SLIP:
printf("\nSlip adapter ");
break;
case MIB_IF_TYPE_OTHER:
default:
printf("\nOther adapter ");
}
printf("%s:\n\n", pAdapt->AdapterName); printf("\tDescription . . . . . . . . : %s\n", pAdapt->Description); printf("\tPhysical Address. . . . . . : ");
for (UINT i=; i<pAdapt->AddressLength; i++)
{
if (i == (pAdapt->AddressLength - ))
printf("%.2X\n",(int)pAdapt->Address[i]);
else
printf("%.2X-",(int)pAdapt->Address[i]);
} printf("\tDHCP Enabled. . . . . . . . : %s\n", (pAdapt->DhcpEnabled ? "yes" : "no")); pAddrStr = &(pAdapt->IpAddressList);
while(pAddrStr)
{
printf("\tIP Address. . . . . . . . . : %s\n", pAddrStr->IpAddress.String);
printf("\tSubnet Mask . . . . . . . . : %s\n", pAddrStr->IpMask.String);
pAddrStr = pAddrStr->Next;
} printf("\tDefault Gateway . . . . . . : %s\n", pAdapt->GatewayList.IpAddress.String);
pAddrStr = pAdapt->GatewayList.Next;
while(pAddrStr)
{
printf("%52s\n", pAddrStr->IpAddress.String);
pAddrStr = pAddrStr->Next;
} printf("\tDHCP Server . . . . . . . . : %s\n", pAdapt->DhcpServer.IpAddress.String);
printf("\tPrimary WINS Server . . . . : %s\n", pAdapt->PrimaryWinsServer.IpAddress.String);
printf("\tSecondary WINS Server . . . : %s\n", pAdapt->SecondaryWinsServer.IpAddress.String); struct tm *newtime; // Display coordinated universal time - GMT
newtime = gmtime(&pAdapt->LeaseObtained);
printf( "\tLease Obtained. . . . . . . : %s", asctime( newtime ) ); newtime = gmtime(&pAdapt->LeaseExpires);
printf( "\tLease Expires . . . . . . . : %s", asctime( newtime ) ); pAdapt = pAdapt->Next;
}
} void DoUsage(bool doUsage)
{ if(doUsage)
{
printf("\nUSAGE:\n"
" ipconfig [/? | /all | /renew [adapter] | /release [adapter] |\n"
" /flushdns | /displaydns | /registerdns |\n"
" /showclassid adapter |\n"
" /setclassid adapter [classid] ]\n"
"\n"
"where\n"
" adapter Connection name\n"
" (wildcard characters * and ? allowed, see examples)\n"
"\n"
" Options:\n"
" /? Display this help message\n"
" /all Display full configuration information.\n"
" /release Release the IP address for the specified adapter.\n"
" /renew Renew the IP address for the specified adapter.\n"
" /flushdns Purges the DNS Resolver cache.\n"
" /registerdns Refreshes all DHCP leases and re-registers DNS names.\n"
" /displaydns Display the contents of the DNS Resolver Cache.\n"
" /showclassid Displays all the dhcp class IDs allowed for adapter.\n"
" /setclassid Modifies the dhcp class id.\n"
"\n"
"The default is to display only the IP address, subnet mask and\n"
"default gateway for each adapter bound to TCP/IP.\n"
"\n"
"For Release and Renew, if no adapter name is specified, then the IP address\n"
"leases for all adapters bound to TCP/IP will be released or renewed.\n"
"\n"
"For Setclassid, if no ClassId is specified, then the ClassId is removed.\n"
"\n"
"Examples:\n"
" > ipconfig ... Show information.\n"
" > ipconfig /all ... Show detailed information\n"
" > ipconfig /renew ... renew all adapters\n"
" > ipconfig /renew EL* ... renew any connection that has its\n"
" name starting with EL\n"
" > ipconfig /release *Con* ... release all matching connections,\n"
" eg. \"Local Area Connection 1\" or\n"
" \"Local Area Connection 2\"\n"); } else
{
printf("ilegal code!"); } }
void DoDisplayDns(bool doDisplayDns) {
if(doDisplayDns)
{
char hostname[];
int iRet = ;
WSADATA wsaData; DNS_STATUS status; //Return value of DnsQuery_A() function.
PDNS_RECORD pDnsRecord;
int assignBuffLenght;
assignBuffLenght=(sizeof(DNS_RECORD))*Max;
pDnsRecord=(DNS_RECORD*)malloc(assignBuffLenght);
memset(pDnsRecord,,assignBuffLenght); if (WSAStartup(MAKEWORD(,),&wsaData)) //调用Windows Sockets DLL
{
printf("Winsock无法初始化!\n");
WSACleanup(); } memset(hostname, , );
iRet = gethostname(hostname, sizeof(hostname));
if(iRet != )
{
printf( "get hostname error:%d\n", iRet);
}
printf("%s\n", hostname); LPSTR pOwnerName=hostname; // Calling function DnsQuery to query Host or PTR records
status = DnsQuery(pOwnerName, //Pointer to OwnerName.
DNS_TYPE_A, //Type of the record to be queried.
DNS_QUERY_STANDARD, // Bypasses the resolver cache on the lookup.
NULL, //Contains DNS server IP address.
&pDnsRecord, //Resource record that contains the response.
NULL); //Reserved for future use. // printf("The host name is %s \n",(pDnsRecord->Data.PTR.pNameHost));
while(pDnsRecord){
printf("The host name is %s \n",pDnsRecord->pName);
printf("the type is %d \n",pDnsRecord->wType);
printf("the lenght of data is %d \n", pDnsRecord->wDataLength);
printf(" the time to live is %d \n", pDnsRecord-> dwTtl);
printf("the lenght of data id %d \n", pDnsRecord-> dwReserved); pDnsRecord=pDnsRecord->pNext;
} printf("dnsCache print over");
}
else
{
printf("ilegal code"); } } void DoFlushDns(bool){ printf("relizing config/flushdns!"); }

转载自:http://blog.csdn.net/dlutbrucezhang/article/details/8577712

ipconfig的C语言实现的更多相关文章

  1. Linux下ipconfig分析及C语言实现

    在linux下使用ifconfigl命令能很方便的查看网卡与网线是否连通,运行ifconfig eth0命令大致输出如下: # ifconfig eth0 eth0 Link encap:Ethern ...

  2. C语言使用cmd命令并获取输出方法

    转自http://blog.csdn.net/hxh129/article/details/8000205 C语言使用cmd命令并获取输出方法 在实践中,我们有时候需要用C语言来调用cmd的命令,并得 ...

  3. C/C++学习----使用C语言代替cmd命令、cmd命令大全

    [开发环境] 物理机版本:Win 7 旗舰版(64位) IDE版本:Visual Studio 2013简体中文旗舰版(cn_visual_studio_ultimate_2013_with_upda ...

  4. C语言运算符与表达式

    1 概论 计算机内存中的数据可以通过变量,常量来表示和存储,那么这些数据如何运算? C语言中提供了大量(34种)的运算符可以用来完成数据的算术,赋值,逻辑,关系,条件判断以及自增自减运算和基于二进制的 ...

  5. c语言基础学习02_windows系统下的cmd命令

    =============================================================================注意:cmd的命令很多,需要用的时候可以查询即 ...

  6. C语言实现ifconfig获取网卡接收和发送流量统计

    在Windows下我们可以利用ipconfig命令获取网卡的相关信息,在Linux下命令是ifconfig 我们可以获取的信息更为丰富,其中包括网卡接收和发送的流量,用C语言实现这个命令并不是一件简单 ...

  7. GO语言的进阶之路-面向过程式编程

    GO语言的进阶之路-面向过程式编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们在用Golang写一个小程序的时候,未免会在多个地方调用同一块代码,这个时候如何优化你的代码呢 ...

  8. D08——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D08 20180829内容纲要: socket网络编程 1  socket基础概念 2  socketserver 3  socket实现简单的SSH服务器端和 ...

  9. D05——C语言基础学PYTHON

    C语言基础学习PYTHON——基础学习D05 20180815内容纲要: 1 模块 2 包 3 import的本质 4 内置模块详解 (1)time&datetime (2)datetime ...

随机推荐

  1. 使用ECharts报表统计公司考勤加班,大家加班多吗?

    最近个项目已经连续加班1个月多,因为公司经常有在外面客户现场或出差的情况,人事每个月初会把上个月的份考勤打卡记录全部发出来,让我们对自己的考勤,突然想到可根据大家打卡时间记录统计每天工作时间,看大家是 ...

  2. c#基础语言编程-Path和Directory

    引言 在程序常会对文件操作,在对文件操作中需要对文件路径的进行定位,在.Net中针对寻找文件提供两个静态类以供调用,Path和Directory. Path类 来自命名空间SYstem.IO,Path ...

  3. android布局之线性布局

    LinearLayout 线性布局有两种,分别是水平线性布局和垂直线性布局,LinearLayout属性中android:orientation为设置线性布局当其="vertical&quo ...

  4. 移植QT到ZedBoard(制作运行库镜像) 交叉编译 分类: ubuntu shell ZedBoard OpenCV 2014-11-08 18:49 219人阅读 评论(0) 收藏

    制作运行库 由于ubuntu的Qt运行库在/usr/local/Trolltech/Qt-4.7.3/下,由makefile可以看到引用运行库是 INCPATH = -I/usr//mkspecs/d ...

  5. max_connections 与 max_used_connections --ERROR 1040: Too many connections

    mysql> show variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value ...

  6. Spring 3 MVC: Themes In Spring-Tutorial With Example---reference

    Welcome to Part 6 of Spring 3.0 MVC Series. In previous article we saw how to add Internationalizati ...

  7. 设置Eclipse中文API提示信息

    准备工作:下载中文API到本机:http://download.java.net/jdk/jdk-api-localizations/jdk-api-zh-cn/publish/1.6.0/html_ ...

  8. jad批量反编译class和jadeclipse集成到eclipse的设置方法

    安装jad配置 1.从http://varaneckas.com/jad/下载windows版本的jad.exe 2.安装完毕后配置jad的系统环境变量 批量解压jar和class文件 1.使用7zi ...

  9. noip 2003 传染病控制(历史遗留问题2333)

    /*codevs 1091 搜索 几个月之前写的70分 今天又写了一遍 并且找到了错误 */ #include<cstdio> #include<vector> #define ...

  10. 利用bat批量执行脚本文件

    1.读取目录文件 利用bat 的for命令读取中的sql文件 for /r %%c in (0*.sql) do echo %%c %%c 相当于变量 in() 中的为循环的范围 此句的作用是显示当前 ...