[Win32]本地计算机网络信息的获取 (三)

2014-11-24 02:02:56 · 作者: · 浏览: 10
system("pause");
return 0;
}

/**
* 用于获取本地主机名、域名和DNS服务器信息的函数:
* DWORD GetNetworkParamsInfo(
* _out PFIXED_INFO pFixedInfo; // 使用FIXED_INFO结构体保存获取到的本地网络参数的信息
* _in PULONG pOutBufLen // 保存pFixedInfo缓冲区的大小
* );
*
* 保存本地主机名、域名和DNS服务器信息的结构体:
* typedef struct {
* char HostName[MAX_HOSTNAME_LEN + 4]; // 本地计算机的主机名
* char DomainName[MAX_DOMAIN_NAME_LEN + 4]; // 本地计算机注册到域的名称
* PIP_ADDR_STRING CurrentDnsServer; // 预留变量
* IP_ADDR_STRING DnsServerList; // 指定本地计算机上定义的DNS服务器列表
* UINT NodeType; // 本地计算机的节点类型
* char ScopeId[MAX_SCOPE_ID_LEN + 4]; // DHCP域名
* UINT EnableRouting; // 指定本地计算机是否启用了路由的功能
* UINT EnableProxy; // 指定本地计算机是否为ARP代理
* UINT EnableDns; // 指定本地计算机是否启用了DNS
* } FIXED_INFO, *PFIXED_INFO;
**/

int GetNetworkParamsFunction() // 获取本地主机名、域名和DNS服务器信息
{
// 声明变量
FIXED_INFO * FixedInfo; // 定义保存本地计算机网络参数信息的结构体指针
ULONG ulOutBufLen; // 保存获取到的本地计算机网络参数信息结构体链表的长度
DWORD dwRetVal; // 调用GetNetworkParams()函数的返回值
IP_ADDR_STRING * pIPAddr; // 保存所有DNS服务器的IP地址列表

// 获取信息

FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) ); // 为FixedInfo结构体分配内存空间
ulOutBufLen = sizeof( FIXED_INFO ); // 初始化ulOutBufLen变量值

// 第1次调用GetNetworkParams()函数,获取返回结果的大小到ulOutBufLen中
if( ERROR_BUFFER_OVERFLOW == GetNetworkParams( FixedInfo, &ulOutBufLen ) ) {
GlobalFree( FixedInfo );
FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen );
}

// 第2次调用GetNetworkParams()函数,以前面获取的ulOutBufLen作为参数,
if ( dwRetVal = GetNetworkParams( FixedInfo, &ulOutBufLen ) != ERROR_SUCCESS) {
printf( "调用GetNetworkParams()函数失败。返回值: %08x\n", dwRetVal );
}
else {
printf( "主机名: %s\n", FixedInfo->HostName );
printf( "域名: %s\n", FixedInfo->DomainName );
printf("\n==========网络信息==========\n");

// 生成节点类型字符串
char* NodeType;
switch(FixedInfo->NodeType){
case BROADCAST_NODETYPE: NodeType = "Broadcase Node"; break;
case PEER_TO_PEER_NODETYPE: NodeType = "Peer to Peer Node"; break;
case MIXED_NODETYPE: NodeType = "Mixed Node"; break;
case HYBRID_NODETYPE: NodeType = "Hybrid Node"; break;
default: NodeType = "Unknown Node"; break;
}

printf("节点类型...................:%d - %s\n", FixedInfo->NodeType, NodeType);
printf("是否启用路由功能...........:%s\n", (FixedInfo->EnableRouting != 0) "是" : "否");
printf("是否启用ARP代理功能........:%s\n", (FixedInfo->EnableProxy != 0) "是" : "否");
printf("是否启用DNS服务器..........:%s\n", (FixedInfo->EnableDns != 0) "是" : "否");

printf( "\nDNS服务器列表:\n" );
printf( "%s\n", FixedInfo->DnsServerList.IpAddress.String );

pIPAddr = FixedInfo->DnsServerList.Next;
while ( pIPAddr ) {
printf( "\t%s\n", pIPAddr->IpAddress.String );
pIPAddr = pIPAddr->Next;
}
}

printf("\n");
system("pause");
return 0;
}

/**
* 用于获取本地计算机网络接口数量