版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第6章 探測(cè)網(wǎng)絡(luò)中的在線設(shè)備課程描述要對(duì)一個(gè)網(wǎng)絡(luò)進(jìn)行管理,首先應(yīng)該知道網(wǎng)絡(luò)中包括哪些設(shè)備和這些設(shè)備的在線狀態(tài)。通常應(yīng)用程序從獲取本地網(wǎng)絡(luò)信息開始,計(jì)算本地子網(wǎng)中包含的所有可能的IP地址,然后使用類似ping命令的功能來發(fā)現(xiàn)本地網(wǎng)絡(luò)。本章將介紹獲取本地網(wǎng)絡(luò)信息和探測(cè)網(wǎng)絡(luò)中在線設(shè)備的方法。 本章知識(shí)點(diǎn)獲取本地計(jì)算機(jī)的網(wǎng)絡(luò)信息掃描子網(wǎng)中的地址6.1 獲取本地計(jì)算機(jī)的網(wǎng)絡(luò)信息6.1.1 使用ipconfig命令獲取本地網(wǎng)絡(luò)信息6.1.2 獲取本地網(wǎng)絡(luò)信息的開發(fā)接口IP Helper API6.1.3 獲取本地網(wǎng)絡(luò)適配器信息6.1.4 獲取本地主機(jī)名、域名和DNS服務(wù)器信息6.1.5 獲取本地計(jì)算機(jī)網(wǎng)絡(luò)
2、接口的基本信息6.1.6 獲取本地計(jì)算機(jī)IP地址表6.1.7 添加和刪除IP地址6.1.1 使用ipconfig命令獲取本地網(wǎng)絡(luò)信息在Windows操作系統(tǒng)中,可以使用ipconfig命令獲取本地網(wǎng)絡(luò)信息。在命令窗口中執(zhí)行ipconfig命令。 查看詳細(xì)網(wǎng)絡(luò)信息執(zhí)行下面的命令:ipconfig /all 6.1.2 獲取本地網(wǎng)絡(luò)信息的開發(fā)接口IP Helper APIIP Helper API可以實(shí)現(xiàn)的主要功能如下:獲取網(wǎng)絡(luò)配置的信息。管理網(wǎng)絡(luò)適配器(Network Adapter),也就是通常所說的網(wǎng)卡,它位于數(shù)據(jù)鏈路層。管理網(wǎng)絡(luò)接口(Interface)。接口表示節(jié)點(diǎn)上對(duì)應(yīng)連接的部分,它位
3、于IP層,因此可以在接口上綁定IP地址。在IP Helper API中,網(wǎng)絡(luò)適配器和接口是一一對(duì)應(yīng)的。管理IP地址。使用ARP協(xié)議。獲取IP和ICMP協(xié)議中的信息。管理路由信息。接收網(wǎng)絡(luò)事務(wù)的通知信息。接收TCP和UDP信息。引用IPHELPAPI.lib在Visual C+項(xiàng)目中,可以使用下面的語(yǔ)句引用IPHELPAPI.lib。#pragma comment(lib, IPHLPAPI.lib)也可以在項(xiàng)目屬性對(duì)話框中選擇“配置屬性”/“鏈接器”/“輸入”,然后在右側(cè)的“附加依賴項(xiàng)”中輸入IPHLPAPI.lib。6.1.3 獲取本地網(wǎng)絡(luò)適配器信息在iphlpapi.h中聲明了GetAda
4、ptersInfo()函數(shù),調(diào)用該函數(shù)可以返回本地網(wǎng)絡(luò)適配器的基本信息,語(yǔ)法如下:DWORD GetAdaptersInfo( PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen );結(jié)構(gòu)體IP_ADAPTER_INFO在iptypes.h中聲明,定義代碼如下:typedef struct _IP_ADAPTER_INFO struct _IP_ADAPTER_INFO* Next; DWORD ComboIndex; char AdapterNameMAX_ADAPTER_NAME_LENGTH + 4; char DescriptionMAX_
5、ADAPTER_DESCRIPTION_LENGTH + 4; UINT AddressLength; BYTE AddressMAX_ADAPTER_ADDRESS_LENGTH; DWORD Index; UINT Type; UINT DhcpEnabled; PIP_ADDR_STRING CurrentIpAddress; IP_ADDR_STRING IpAddressList; IP_ADDR_STRING GatewayList; IP_ADDR_STRING DhcpServer; BOOL HaveWins; IP_ADDR_STRING PrimaryWinsServer
6、; IP_ADDR_STRING SecondaryWinsServer; time_t LeaseObtained; time_t LeaseExpires; IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;結(jié)構(gòu)體IP_ADAPTER_INFO中定義的成員變量成員變量說明Next指定網(wǎng)絡(luò)適配器鏈表中的下一個(gè)網(wǎng)絡(luò)適配器ComboIndex預(yù)留變量AdapterName網(wǎng)絡(luò)適配器的名稱Description網(wǎng)絡(luò)適配器的描述信息AddressLength網(wǎng)絡(luò)適配器MAC地址的長(zhǎng)度Address網(wǎng)絡(luò)適配器的MAC地址Index網(wǎng)絡(luò)適配器索引。當(dāng)一個(gè)網(wǎng)絡(luò)適配器被禁用然后又重新啟用
7、后,該適配器的索引將發(fā)生變化。因此該值并不是網(wǎng)絡(luò)適配器的唯一標(biāo)識(shí)Type網(wǎng)絡(luò)適配器的類型,包括MIB_IF_TYPE_OTHER、MIB_IF_TYPE_ETHERNET、MIB_IF_TYPE_TOKENRING、MIB_IF_TYPE_FDDI、MIB_IF_TYPE_PPP、MIB_IF_TYPE_LOOPBACK和MIB_IF_TYPE_SLIP等。這些值在IPIfCons.h中定義DhcpEnabled指定該網(wǎng)絡(luò)適配器上是否啟用了DHCP協(xié)議CurrentIpAddress預(yù)留變量IpAddressList與此網(wǎng)絡(luò)適配器相關(guān)聯(lián)的IP地址列表GatewayList該網(wǎng)絡(luò)適配器上定義的I
8、P地址的默認(rèn)網(wǎng)關(guān)DhcpServer該網(wǎng)絡(luò)適配器上定義的DHCP服務(wù)器的IP地址HaveWins標(biāo)明該網(wǎng)絡(luò)適配器是否啟用了WINSPrimaryWinsServer主WINS服務(wù)器的IP地址SecondaryWinsServer從WINS服務(wù)器的IP地址LeaseObtained當(dāng)前的DHCP租借獲取的時(shí)間,只有在啟用DHCP時(shí)生效LeaseExpires當(dāng)前的DHCP租借失效的時(shí)間,只有在啟用DHCP時(shí)生效【例6.1】通過一個(gè)實(shí)例來介紹如何使用Visual C+編寫獲取本地網(wǎng)絡(luò)信息的程序。實(shí)例是一個(gè)控制臺(tái)項(xiàng)目。1聲明頭文件在GetIPConfig.cpp中需要聲明程序中使用的頭文件,并引用I
9、PHLPAPI.lib,代碼如下:#include stdafx.h#pragma comment(lib, IPHLPAPI.lib) #include #include #include 2聲明變量在主函數(shù)_tmain()中,首先需要聲明程序中使用的變量,代碼如下:/ 指定獲取到的網(wǎng)絡(luò)信息結(jié)構(gòu)體鏈表的指針I(yè)P_ADAPTER_INFO *pAdapterInfo;/ 保存獲取到的網(wǎng)絡(luò)信息結(jié)構(gòu)體鏈表的長(zhǎng)度ULONG ulOutBufLen;/ 返回調(diào)用編碼DWORD dwRetVal;/ 在輪循所有網(wǎng)絡(luò)適配器信息時(shí)使用的單個(gè)結(jié)構(gòu)體變量PIP_ADAPTER_INFO pAdapter;3獲取
10、本地網(wǎng)絡(luò)適配器信息在獲取本地信息的過程中,需要兩次調(diào)用GetAdaptersInfo()函數(shù)。第1次調(diào)用可以獲取返回?cái)?shù)據(jù)的大小,第2次調(diào)用使用前面獲取到的數(shù)據(jù)大小作為參數(shù),獲取實(shí)際的IP_ADAPTER_INFO結(jié)構(gòu)體內(nèi)容,具體代碼如下:/ 為pAdapterInfo分配空間pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO);ulOutBufLen = sizeof(IP_ADAPTER_INFO);/ 第1次調(diào)用GetAdaptersInfo(),獲取返回結(jié)果的大小到ulOutBufLen中if(GetAdapte
11、rsInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)free(pAdapterInfo);pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);/ 第2次調(diào)用GetAdaptersInfo(),獲取本地網(wǎng)絡(luò)信息到結(jié)構(gòu)體pAdapterInfo中if(dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)printf(GetAdaptersInfo Error! %dn, dwRetVal);4顯示本地
12、網(wǎng)絡(luò)適配器信息現(xiàn)在本地網(wǎng)絡(luò)信息已經(jīng)讀取到pAdapterInfo鏈表中,因?yàn)楸镜赜?jì)算機(jī)上可能安裝多個(gè)網(wǎng)絡(luò)適配器,所以需要使用While語(yǔ)句循環(huán)處理pAdapterInfo鏈表中的每個(gè)IP_ADAPTER_INFO結(jié)構(gòu)體,并顯示其中的網(wǎng)絡(luò)信息,代碼如下:/ 從pAdapterInfo 獲取并顯示本地網(wǎng)絡(luò)信息pAdapter = pAdapterInfo;while(pAdapter)printf(網(wǎng)絡(luò)適配器名: tt%sn, pAdapter-AdapterName);printf(網(wǎng)絡(luò)適配器描述: t%snn, pAdapter-Description);printf(MAC地址: tt);/
13、 處理MAC地址for(int i=0; iAddressLength; i+)if(i=(pAdapter-AddressLength -1)printf(%.2Xn, (int)pAdapter-Addressi);elseprintf(%.2X-, (int)pAdapter-Addressi); 4顯示本地網(wǎng)絡(luò)適配器信息printf(IP地址: tt%sn, pAdapter-IpAddressList.IpAddress.String);printf(子網(wǎng)掩碼: tt%sn, pAdapter-IpAddressList.IpMask.String);printf(網(wǎng)關(guān): ttt%s
14、n, pAdapter-GatewayList.IpAddress.String);printf(*n);if(pAdapter-DhcpEnabled)printf(啟用DHCP: tt是n);printf(DHCP服務(wù)器: tt%sn, pAdapter-DhcpServer.IpAddress.String);elseprintf(啟用DHCP: tt否n);/ 處理下一個(gè)網(wǎng)絡(luò)適配器pAdapter = pAdapter-Next;5釋放資源處理完成后,需要將釋放到pAdapter鏈表所占用的內(nèi)存空間,代碼如下:/ 釋放資源if(pAdapterInfo)free(pAdapterInf
15、o);6暫停程序,等待用戶響應(yīng)在顯示本地網(wǎng)絡(luò)信息后,程序處于暫停狀態(tài),等待用戶響應(yīng),代碼如下:printf(nn);system(pause); return 0;system(pause);語(yǔ)句的功能是暫停系統(tǒng)的工作,并在控制臺(tái)輸出“按任意鍵繼續(xù)”。用戶按任意鍵后,程序繼續(xù)運(yùn)行,執(zhí)行return 0;語(yǔ)句退出_tmain()函數(shù)。6.1.4 獲取本地主機(jī)名、域名和DNS服務(wù)器信息調(diào)用GetNetworkParams()函數(shù)可以返回本地的網(wǎng)絡(luò)參數(shù)信息,包括本地的主機(jī)名、域名和DNS服務(wù)器列表等。GetNetworkParams()函數(shù)的語(yǔ)法如下:DWORD GetNetworkParams(
16、_out PFIXED_INFO pFixedInfo, _in PULONG pOutBufLen);參數(shù)pFixedInfo是輸出參數(shù),它是一個(gè)指向緩沖區(qū)的指針,緩沖區(qū)中使用FIXED_INFO結(jié)構(gòu)體保存獲取到的本地網(wǎng)絡(luò)參數(shù)信息;參數(shù)pOutBufLen是一個(gè)指向ULONG變量的指針,保存pFixedInfo緩沖區(qū)的大小。PFIXED_INFOPFIXED_INFO是指定結(jié)構(gòu)體FIXED_INFO的指針,它在iptypes.h中聲明,定義代碼如下:typedef struct char HostNameMAX_HOSTNAME_LEN + 4; char DomainNameMAX_DOM
17、AIN_NAME_LEN + 4; PIP_ADDR_STRING CurrentDnsServer; IP_ADDR_STRING DnsServerList; UINT NodeType; char ScopeIdMAX_SCOPE_ID_LEN + 4; UINT EnableRouting; UINT EnableProxy; UINT EnableDns;FIXED_INFO, *PFIXED_INFO;【例6.2】介紹使用IP Helper API獲取本地網(wǎng)絡(luò)參數(shù)信息的具體代碼。首先創(chuàng)建一個(gè)Win32控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為GetNetworkParams,其主文件名為GetNe
18、tworkParams.cpp。1聲明頭文件在GetNetworkParams.cpp中需要聲明程序中使用的頭文件,并引用IPHLPAPI.lib,代碼如下:#include stdafx.h#include #include #include #pragma comment(lib, IPHLPAPI.lib)2聲明變量在主函數(shù)_tmain()中,首先需要聲明程序中使用的變量,代碼如下:/ 定義保存本地計(jì)算機(jī)網(wǎng)絡(luò)參數(shù)信息的結(jié)構(gòu)體指針FIXED_INFO * FixedInfo;/ 保存獲取到的本地計(jì)算機(jī)網(wǎng)絡(luò)參數(shù)信息結(jié)構(gòu)體鏈表的長(zhǎng)度ULONG ulOutBufLen;/ 調(diào)用GetNetwor
19、kParams()函數(shù)的返回值DWORD dwRetVal;/ 保存所有DNS服務(wù)器的IP地址列表IP_ADDR_STRING * pIPAddr;3獲取本地網(wǎng)絡(luò)參數(shù)信息需要兩次調(diào)用GetNetworkParams()函數(shù)。第1次調(diào)用可以獲取返回?cái)?shù)據(jù)的大小,第2次調(diào)用使用前面獲取到的數(shù)據(jù)大小作為參數(shù),獲取實(shí)際的FIXED_INFO結(jié)構(gòu)體內(nèi)容,具體代碼如下:/ 為FixedInfo結(jié)構(gòu)體分配內(nèi)存空間FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, sizeof( FIXED_INFO ) );/ 初始化ulOutBufLen變量值ulOutBufLen
20、= sizeof( FIXED_INFO );/ 第次調(diào)用GetNetworkParams()函數(shù),獲取返回結(jié)果的大小到ulOutBufLen中if( ERROR_BUFFER_OVERFLOW = GetNetworkParams( FixedInfo, &ulOutBufLen ) ) GlobalFree( FixedInfo );FixedInfo = (FIXED_INFO *) GlobalAlloc( GPTR, ulOutBufLen );/ 第次調(diào)用GetNetworkParams()函數(shù),以前面獲取的ulOutBufLen作為參數(shù),if ( dwRetVal = GetNe
21、tworkParams( FixedInfo, &ulOutBufLen ) != ERROR_SUCCESS) printf( 調(diào)用GetNetworkParams()函數(shù)失敗。返回值: %08xn, dwRetVal );4顯示本地網(wǎng)絡(luò)參數(shù)信息else printf( 主機(jī)名: %sn, FixedInfo-HostName );printf( 域名: %sn, FixedInfo-DomainName ); printf(n=網(wǎng)絡(luò)信息=n); / 生成節(jié)點(diǎn)類型字符串 char* NodeType; 4顯示本地網(wǎng)絡(luò)參數(shù)信息 switch(FixedInfo-NodeType) case B
22、ROADCAST_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; 4顯示本地網(wǎng)絡(luò)參數(shù)信息printf(節(jié)點(diǎn)類型.:%d - %sn, FixedInfo-Nod
23、eType, NodeType); printf(是否啟用路由功能.:%sn, (FixedInfo-EnableRouting != 0) ? 是 : 否); printf(是否啟用ARP代理功能.:%sn, (FixedInfo-EnableProxy != 0) ? 是 : 否); printf(是否啟用DNS服務(wù)器.:%sn, (FixedInfo-EnableDns != 0) ? 是 : 否); printf( nDNS服務(wù)器列表:n );printf( %sn, FixedInfo - DnsServerList.IpAddress.String );pIPAddr = Fixe
24、dInfo - DnsServerList.Next; while ( pIPAddr ) printf( t%sn, pIPAddr -IpAddress.String );pIPAddr = pIPAddr -Next;IP_ADDR_STRING結(jié)構(gòu)體typedef struct _IP_ADDR_STRING struct _IP_ADDR_STRING* Next; IP_ADDRESS_STRING IpAddress; IP_MASK_STRING IpMask; DWORD Context; IP_ADDR_STRING, *PIP_ADDR_STRING;5暫停程序,等待用戶
25、響應(yīng)在顯示本地網(wǎng)絡(luò)信息后,程序處于暫停狀態(tài),等待用戶響應(yīng),代碼如下:printf(nn);system(pause); return 0;6.1.5 獲取本地計(jì)算機(jī)網(wǎng)絡(luò)接口的基本信息1獲取本地計(jì)算機(jī)的網(wǎng)絡(luò)接口數(shù)量2獲取本地計(jì)算機(jī)網(wǎng)絡(luò)接口的基本信息1獲取本地計(jì)算機(jī)的網(wǎng)絡(luò)接口數(shù)量可以通過調(diào)用GetNumberOfInterfaces()函數(shù)獲取本地計(jì)算機(jī)的網(wǎng)絡(luò)接口數(shù)量,語(yǔ)法如下:DWORD GetNumberOfInterfaces( _out PDWORD pdwNumIf);參數(shù)pdwNumIf用于接受獲取到的本地計(jì)算機(jī)網(wǎng)絡(luò)接口數(shù)量。函數(shù)的返回值為DWORD類型,如果調(diào)用成功,則返回NO_ER
26、ROR;否則表示調(diào)用失敗?!纠?.3】#include stdafx.h#include #include #include #pragma comment(lib, IPHLPAPI.lib)int _tmain(int argc, _TCHAR* argv)/ 用于獲取接口數(shù)量DWORD dwNumIf;/ 返回值DWORD dwRetVal;if(dwRetVal = GetNumberOfInterfaces(&dwNumIf) = NO_ERROR)printf(本地網(wǎng)絡(luò)接口數(shù)量為: %d, dwNumIf);elseprintf(調(diào)用GetNumberOfInterfaces()函
27、數(shù)時(shí)出現(xiàn)錯(cuò)誤。);printf(nn);system(pause); return 0;2獲取本地計(jì)算機(jī)網(wǎng)絡(luò)接口的基本信息可以通過調(diào)用GetInterfaceInfo()函數(shù)獲取本地計(jì)算機(jī)網(wǎng)絡(luò)接口的基本信息,語(yǔ)法如下:DWORD GetInterfaceInfo( _out PIP_INTERFACE_INFO pIfTable, _inout PULONG dwOutBufLen);PIP_INTERFACE_INFOtypedef struct _IP_INTERFACE_INFO LONG NumAdapters; IP_ADAPTER_INDEX_MAP Adapter1;IP_INT
28、ERFACE_INFO, *PIP_INTERFACE_INFO;typedef struct _IP_ADAPTER_INDEX_MAP ULONG Index; WCHAR NameMAX_ADAPTER_NAME;IP_ADAPTER_INDEX_MAP, *PIP_ADAPTER_INDEX_MAP;【例6.4】首先創(chuàng)建一個(gè)Win32控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為GetInterfaceInfo,其主文件名為GetInterfaceInfo.cpp。頭文件和庫(kù)文件#include stdafx.h#include #include #include #pragma comment(lib,
29、 IPHLPAPI.lib)分配和釋放內(nèi)存空間/ 分配內(nèi)存空間#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x) / 釋放內(nèi)存空間#define FREE(x) HeapFree(GetProcessHeap(), 0, (x)在主函數(shù)_tmain()中聲明變量/ 保存網(wǎng)絡(luò)接口信息的結(jié)構(gòu)體指針PIP_INTERFACE_INFO pInfo;/ 保存獲取數(shù)據(jù)的長(zhǎng)度ULONG ulOutBufLen = 0;/ 返回結(jié)果DWORD dwRetVal = 0;/ _tmain()函數(shù)的返回結(jié)果int iReturn = 1;調(diào)用GetInter
30、faceInfo()函數(shù)/ 第次調(diào)用GetInterfaceInfo,獲取數(shù)據(jù)大小,保存到ulOutBufLen變量中dwRetVal = GetInterfaceInfo(NULL, &ulOutBufLen);if (dwRetVal = ERROR_INSUFFICIENT_BUFFER) pInfo = (IP_INTERFACE_INFO *) MALLOC(ulOutBufLen); if (pInfo = NULL) printf(無法分配GetInterfaceInfo函數(shù)需要的內(nèi)存空間。n); return 1; 調(diào)用GetInterfaceInfo()函數(shù)/ 第次調(diào)用Get
31、InterfaceInfo函數(shù),獲取需要的實(shí)際數(shù)據(jù)dwRetVal = GetInterfaceInfo(pInfo, &ulOutBufLen);if (dwRetVal = NO_ERROR) printf(網(wǎng)絡(luò)適配器數(shù)量: %ldnn, pInfo-NumAdapters); for (int i = 0; i NumAdapters; i+) printf(網(wǎng)絡(luò)適配器索引%d: %ldn, i, pInfo-Adapteri.Index); printf(網(wǎng)絡(luò)適配器名稱%d: %wsnn, i, pInfo-Adapteri.Name); iReturn = 0; else if (d
32、wRetVal = ERROR_NO_DATA) printf(本地計(jì)算機(jī)上沒有支持IPv4的網(wǎng)絡(luò)適配器。n); iReturn = 0; else printf(GetInterfaceInfo調(diào)用失敗: %dn, dwRetVal); iReturn = 1;等待用戶響應(yīng)/ 釋放內(nèi)存空間FREE(pInfo);/ 按任意鍵繼續(xù)system(pause);return (iReturn);6.1.6 獲取本地計(jì)算機(jī)IP地址表可以通過調(diào)用GetIpAddrTable()函數(shù)獲取本地計(jì)算機(jī)網(wǎng)絡(luò)接口和IP地址的映射表,語(yǔ)法如下:DWORD GetIpAddrTable( _out PMIB_IPA
33、DDRTABLE pIpAddrTable, _inout PULONG pdwSize, _in BOOL bOrder);PMIB_IPADDRTABLE結(jié)構(gòu)體typedef struct _MIB_IPADDRROW DWORD dwAddr; DWORD dwIndex; DWORD dwMask; DWORD dwBCastAddr; DWORD dwReasmSize; unsigned short unused1; unsigned short wType;MIB_IPADDRROW, *PMIB_IPADDRROW;【例6.5】下面介紹使用IP Helper API獲取本地IP
34、地址表的具體代碼。首先創(chuàng)建一個(gè)Win32控制臺(tái)應(yīng)用程序,項(xiàng)目名稱為GetIpAddrTable,其主文件名為GetIpAddrTable.cpp。頭文件和庫(kù)文件#include stdafx.h#include #include #include #pragma comment(lib, iphlpapi.lib)#pragma comment(lib, ws2_32.lib)分配和釋放內(nèi)存空間/ 分配內(nèi)存空間#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x) / 釋放內(nèi)存空間#define FREE(x) HeapFree(GetProc
35、essHeap(), 0, (x)在主函數(shù)_tmain()中聲明變量/ 網(wǎng)絡(luò)接口與IP地址映射表PMIB_IPADDRTABLE pIPAddrTable;/ 獲取數(shù)據(jù)的大小DWORD dwSize = 0;/ 調(diào)用GetIPAddrTable()函數(shù)的返回值DWORD dwRetVal = 0;/ 保存IP地址的結(jié)構(gòu)體IN_ADDR IPAddr;/ 用于獲取錯(cuò)誤信息LPVOID lpMsgBuf;調(diào)用GetIpAddrTable()函數(shù) / 分配內(nèi)存空間 pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE);
36、/ 第次調(diào)用GetIpAddrTable()函數(shù),獲取數(shù)據(jù)的大小到dwSize if (pIPAddrTable) if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) = ERROR_INSUFFICIENT_BUFFER) FREE(pIPAddrTable); pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize); if (pIPAddrTable = NULL) printf(GetIpAddrTable()函數(shù)內(nèi)存分配失敗n); exit(1); 調(diào)用GetIpAddrTable()函數(shù) / 第次調(diào)用G
37、etIpAddrTable()函數(shù),獲取實(shí)際數(shù)據(jù) if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 ) != NO_ERROR ) printf(GetIpAddrTable()調(diào)用失敗: %dn, dwRetVal); if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBL
38、ANG_DEFAULT), / Default language (LPTSTR) & lpMsgBuf, 0, NULL) printf(t錯(cuò)誤信息: %s, lpMsgBuf); LocalFree(lpMsgBuf); exit(1); 顯示pIPAddrTable結(jié)構(gòu)體 printf(t記錄數(shù)量: %ldn, pIPAddrTable-dwNumEntries); for (i=0; i dwNumEntries; i+) printf(nt接口序號(hào)%d:t%ldn, i, pIPAddrTable-tablei.dwIndex); IPAddr.S_un.S_addr = (u_lo
39、ng) pIPAddrTable-tablei.dwAddr; printf(tIP地址%d: t%sn, i, inet_ntoa(IPAddr) ); IPAddr.S_un.S_addr = (u_long) pIPAddrTable-tablei.dwMask; printf(t子網(wǎng)掩碼%d: t%sn, i, inet_ntoa(IPAddr) ); IPAddr.S_un.S_addr = (u_long) pIPAddrTable-tablei.dwBCastAddr; printf(t廣播地址%d: t%s (%ld%)n, i, inet_ntoa(IPAddr), pIPA
40、ddrTable-tablei.dwBCastAddr); printf(t重組報(bào)文最大數(shù)量%d:t%ldn, i, pIPAddrTable-tablei.dwReasmSize); printf(t類型和狀態(tài)%d:, i); if (pIPAddrTable-tablei.wType & MIB_IPADDR_PRIMARY) printf(t主IP地址); if (pIPAddrTable-tablei.wType & MIB_IPADDR_DYNAMIC) printf(t動(dòng)態(tài)IP地址); if (pIPAddrTable-tablei.wType & MIB_IPADDR_DISCO
41、NNECTED) printf(t斷開連接的接口對(duì)應(yīng)的IP地址); if (pIPAddrTable-tablei.wType & MIB_IPADDR_DELETED) printf(t刪除的IP地址); if (pIPAddrTable-tablei.wType & MIB_IPADDR_TRANSIENT) printf(t臨時(shí)地址); printf(n); 釋放資源,等待用戶響應(yīng)/ 釋放內(nèi)存空間if (pIPAddrTable) FREE(pIPAddrTable); pIPAddrTable = NULL;printf(n);system(pause);return 0;例6.5的運(yùn)
42、行界面6.1.7 添加和刪除IP地址一個(gè)網(wǎng)絡(luò)適配器上可以定義多個(gè)IP地址。調(diào)用AddIPAddress()函數(shù)可以向指定的網(wǎng)絡(luò)適配器中添加IP地址,調(diào)用DeleteIPAddress()函數(shù)可以刪除指定的IP地址。AddIPAddress()函數(shù)DWORD AddIPAddress( _in IPAddr Address, _in IPMask IpMask, _in DWORD IfIndex, _out PULONG NTEContext, _out PULONG NTEInstance);參數(shù)說明如下:Address,指定要添加的IP地址。IpMask,指定IP地址對(duì)應(yīng)的子網(wǎng)掩碼。IfI
43、ndex,指定添加IP地址的網(wǎng)絡(luò)適配器的索引。NTEContext,如果調(diào)用AddIPAddress()函數(shù)成功,則指向一個(gè)與這個(gè)IP地址關(guān)聯(lián)的網(wǎng)絡(luò)表接口。之后可以在DeleteIPAddress()函數(shù)中使用該接口來刪除指定的IP地址。NTEInstance,如果調(diào)用成功,則指向與該IP地址相關(guān)聯(lián)的網(wǎng)絡(luò)表接口實(shí)例。DeleteIPAddress()DWORD DeleteIPAddress( _in ULONG NTEContext);參數(shù)UTEContext是前面調(diào)用AddIPAddress()函數(shù)時(shí)返回的與IP地址相關(guān)聯(lián)的網(wǎng)絡(luò)表接口。也就是說,DeleteIPAddress()函數(shù)只能刪
44、除使用AddIPAddress()函數(shù)添加的臨時(shí)IP地址?!纠?.6】使用IP Helper API獲取添加和刪除IP地址。引用頭文件庫(kù)文件,代碼如下:#include stdafx.h#include #include #include #include #pragma comment(lib, iphlpapi.lib)#pragma comment(lib, ws2_32.lib)分配和釋放內(nèi)存空間/ 分配內(nèi)存空間#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x) / 釋放內(nèi)存空間#define FREE(x) HeapFree(Ge
45、tProcessHeap(), 0, (x)在主函數(shù)_tmain()中聲明變量/ 調(diào)用GetIpAddrTable()函數(shù)中使用的結(jié)構(gòu)體PMIB_IPADDRTABLE pIPAddrTable;/ 獲取數(shù)據(jù)的大小DWORD dwSize = 0;/ 調(diào)用GetIPAddrTable()函數(shù)的返回值DWORD dwRetVal = 0;/ 保存IP地址的結(jié)構(gòu)體IN_ADDR IPAddr;/ IP地址對(duì)應(yīng)的接口索引DWORD ifIndex;/ 要添加的IP地址和子網(wǎng)掩碼UINT iaIPAddress;UINT iaIPMask;/ 用于處理添加IP地址的返回變量ULONG NTEConte
46、xt = 0;ULONG NTEInstance = 0;/ 用于輸出錯(cuò)誤信息的變量LPVOID lpMsgBuf;驗(yàn)證IP地址格式 / 驗(yàn)證命令行參數(shù)的數(shù)量 if (argc != 3) printf(usage: %s IPAddress SubnetMaskn, argv0); exit(1); / 驗(yàn)證命令行參數(shù)中IP地址的格式是否正確 iaIPAddress = inet_addr(argv1); if (iaIPAddress = INADDR_NONE) printf(usage: %s IPAddress SubnetMaskn, argv0); exit(1); / 驗(yàn)證命令
47、行參數(shù)中子網(wǎng)掩碼的格式是否正確 iaIPMask = inet_addr(argv2); if (iaIPMask = INADDR_NONE) printf(usage: %s IPAddress SubnetMaskn, argv0); exit(1); 調(diào)用GetIpAddrTable()函數(shù) / 分配內(nèi)存空間 pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE); if (pIPAddrTable = NULL) printf(Error allocating memory needed to call G
48、etIpAddrTablen); exit (1); else dwSize = 0;/ 第次調(diào)用GetIpAddrTable()函數(shù),獲取數(shù)據(jù)的大小到dwSize if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) = ERROR_INSUFFICIENT_BUFFER) FREE(pIPAddrTable); pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize); if (pIPAddrTable = NULL) printf(Memory allocation failed for GetIpAddrTa
49、blen); exit(1); 調(diào)用GetIpAddrTable()函數(shù) / 調(diào)用GetIpAddrTable()函數(shù),獲取地址表數(shù)據(jù) if (dwRetVal = GetIpAddrTable(pIPAddrTable, &dwSize, 0) = NO_ERROR) / 獲取當(dāng)前IP地址對(duì)應(yīng)的接口索引,在后面添加IP地址時(shí)使用 ifIndex = pIPAddrTable-table0.dwIndex; printf(ntInterface Index:t%ldn, ifIndex); IPAddr.S_un.S_addr = (u_long) pIPAddrTable-table0.dw
50、Addr; printf(tIP Address: t%s (%lu%)n, inet_ntoa(IPAddr), pIPAddrTable-table0.dwAddr); IPAddr.S_un.S_addr = (u_long) pIPAddrTable-table0.dwMask; printf(tSubnet Mask: t%s (%lu%)n, inet_ntoa(IPAddr), pIPAddrTable-table0.dwMask); IPAddr.S_un.S_addr = (u_long) pIPAddrTable-table0.dwBCastAddr; printf(tBr
51、oadCast Address:t%s (%lu%)n, inet_ntoa(IPAddr), pIPAddrTable-table0.dwBCastAddr); printf(tReassembly size: t%lunn, pIPAddrTable-table0.dwReasmSize); else printf(調(diào)用GetIpAddrTable失敗: %d.n, dwRetVal); if (pIPAddrTable) FREE(pIPAddrTable); exit(1); 釋放資源 if (pIPAddrTable) FREE(pIPAddrTable); pIPAddrTable
52、 = NULL; 添加IP地址的代碼/ 添加IP地址 if (dwRetVal = AddIPAddress(iaIPAddress, iaIPMask, ifIndex, &NTEContext, &NTEInstance) = NO_ERROR) printf(tIPv4地址成功添加.n, argv1); else printf(調(diào)用AddIPAddress()函數(shù)失敗: %dn, dwRetVal); if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE
53、_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), / Default language (LPTSTR) & lpMsgBuf, 0, NULL) printf(錯(cuò)誤: %s, lpMsgBuf); LocalFree(lpMsgBuf); exit(1); 刪除IP地址的代碼/ 刪除剛剛添加的IP地址 if (dwRetVal = DeleteIPAddress(NTEContext) = NO_ERROR) printf(tIPv4地址%s 被成功刪除.n, argv1); else pr
54、intf(t調(diào)用DeleteIPAddress()函數(shù)失敗: %dn, dwRetVal); exit(1); 配置命令行參數(shù)因?yàn)槌绦蛑惺褂昧嗣钚袇?shù),所以在調(diào)試和運(yùn)行程序之前需要配置命令行參數(shù)。在系統(tǒng)菜單中選擇“項(xiàng)目”/“AddIPAddress屬性”,打開項(xiàng)目屬性對(duì)話框。6.2 掃描子網(wǎng)中的地址6.2.1 計(jì)算指定子網(wǎng)內(nèi)包含的所有IP地址6.2.2 實(shí)現(xiàn)ping的功能6.2.3 掃描子網(wǎng)6.2.1 計(jì)算指定子網(wǎng)內(nèi)包含的所有IP地址要掃描一個(gè)子網(wǎng),首先需要計(jì)算該子網(wǎng)中包含的所有IP地址??梢愿鶕?jù)子網(wǎng)中的一個(gè)IP地址和子網(wǎng)掩碼計(jì)算出該子網(wǎng)的網(wǎng)絡(luò)地址(該子網(wǎng)中最小的IP地址)和廣播地址(該子網(wǎng)
55、中最大的IP地址)。將IP地址與子網(wǎng)掩碼執(zhí)行按位與運(yùn)算,即可計(jì)算出子網(wǎng)的子網(wǎng)地址,公式如下: = & 將子網(wǎng)掩碼執(zhí)行按位非操作,然后再將結(jié)果與IP地址執(zhí)行按位或運(yùn)算,即可計(jì)算出子網(wǎng)的廣播地址,公式如下: = | 【例6.7】下面通過一個(gè)實(shí)例程序來演示計(jì)算指定子網(wǎng)內(nèi)包含所有IP地址的方法。實(shí)例是一個(gè)控制臺(tái)項(xiàng)目,項(xiàng)目名稱為CalculateSubnet,其主文件名為CalculateSubnet.cpp。運(yùn)行界面如下:1聲明頭文件在CalculateSubnet.cpp中需要聲明程序中使用的頭文件,并引用Ws2_32.lib,代碼如下:#include stdafx.h#include Winso
56、ck2.h#pragma comment(lib, Ws2_32.lib)ws2_32.lib是Windows Sockets應(yīng)用程序接口,用于支持Internet和網(wǎng)絡(luò)應(yīng)用程序。2判斷命令行參數(shù)的數(shù)量int _tmain(int argc, _TCHAR* argv)if(argc != 3)printf(Usage: CalculateSubnet netaddr netmaskrnExample: CalculateSubnet );return 1;_tmain()函數(shù)有兩個(gè)參數(shù),argc表示命令行參數(shù)的數(shù)量,argv數(shù)組表示命令行參數(shù)
57、的具體內(nèi)容??蓤?zhí)行程序本身是第1個(gè)參數(shù),因此在本例中如果命令行參數(shù)正確,則參數(shù)argc的值應(yīng)該等于3。3判斷IP地址是否合法判斷IP地址是否合法的標(biāo)準(zhǔn)如下:字符串中必須包含3個(gè)逗號(hào)(.)。被逗號(hào)分隔的4個(gè)字符串的長(zhǎng)度必須小于或等于3。被逗號(hào)分隔的4個(gè)字符串必須可以轉(zhuǎn)換成整數(shù)。被逗號(hào)分隔的4個(gè)字符串轉(zhuǎn)換成的整數(shù)不得大于255。程序中使用自定義函數(shù)IsValidIP()函數(shù)判斷IP地址是否合法。4計(jì)算網(wǎng)絡(luò)地址和廣播地址計(jì)算子網(wǎng)網(wǎng)絡(luò)地址和廣播地址的代碼如下:printf(netaddr: %sn, argv1);printf(netmask: %sn, argv2);unsigned long ln
58、etaddr = ntohl(inet_addr(argv1);unsigned long lnetmask = ntohl(inet_addr(argv2);unsigned long l_first_netaddr = lnetaddr & lnetmask;unsigned long l_broadcast = lnetaddr | lnetmask;5顯示IP地址的數(shù)量和列表/ 計(jì)算子網(wǎng)中包含有效IP地址的數(shù)量long num = l_broadcast - l_first_netaddr - 1;printf(Number of valid IPs: %dnn, num); / 顯示
59、子網(wǎng)中的IP地址printf(IPs in subnet: n=n);for(unsigned long i=l_first_netaddr+1; ii_type = ICMP_ECHO;/ 將類型設(shè)置為ICMP響應(yīng)包 icmp_hdr-i_code = 0;/ 將編碼設(shè)置為 / 將編號(hào)設(shè)置為當(dāng)前線程的編號(hào) icmp_hdr-i_id = (USHORT)GetCurrentThreadId(); icmp_hdr-i_cksum = 0;/ 將校驗(yàn)和設(shè)置為 icmp_hdr-i_seq = 0;/ 將序列號(hào)設(shè)置為 datapart = icmp_data + sizeof(IcmpHeade
60、r);/ 定義到數(shù)據(jù)部分 / 在數(shù)據(jù)部分隨便填充一些數(shù)據(jù) memset(datapart,E, datasize - sizeof(IcmpHeader);3解析ICMP回應(yīng)包decode_resp()函數(shù)的參數(shù)說明如下:buf,接收數(shù)據(jù)包的緩沖區(qū)。bytes,接收到數(shù)據(jù)的長(zhǎng)度。from,發(fā)送數(shù)據(jù)包的IP地址。tid,用于接收ICMP數(shù)據(jù)包的線程ID。程序的運(yùn)行過程如下:(1)計(jì)算IP數(shù)據(jù)包頭的長(zhǎng)度。(2)如果指定的緩沖區(qū)長(zhǎng)度小于IP包頭加上最小的ICMP包長(zhǎng)度,則說明它包含的ICMP數(shù)據(jù)不完整或者不包含ICMP數(shù)據(jù),函數(shù)返回-1。(3)定位到ICMP包頭的起始位置。(4)判斷ICMP包的類型
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 總經(jīng)理聘用合同簽訂與授權(quán)
- 休閑度假房產(chǎn)打印身心放松
- 商業(yè)建筑砌墻施工合同
- 農(nóng)村宅基地租賃協(xié)議模板
- 航空客服招聘合同模板
- 農(nóng)業(yè)園區(qū)機(jī)耕道修建協(xié)議
- 防噪音卷簾門安裝合同樣本
- JJJ景區(qū)餐飲店投標(biāo)方案
- 服裝設(shè)計(jì)教師招聘協(xié)議
- 教育機(jī)構(gòu)加班安排細(xì)則
- 管溝開挖安全培訓(xùn)課件
- Clean-PVC管道粘接施工工藝標(biāo)準(zhǔn)
- 道教與中醫(yī)學(xué)習(xí)通超星課后章節(jié)答案期末考試題庫(kù)2023年
- 四年級(jí)語(yǔ)文試卷選擇題100道
- 升壓站設(shè)備安裝調(diào)試工程施工質(zhì)量驗(yàn)收及評(píng)定范圍劃分表
- 工程質(zhì)量安全手冊(cè)課件
- 2023北京東城區(qū)初二上期末考數(shù)學(xué)試卷及答案
- 科幻小說賞讀知到章節(jié)答案智慧樹2023年杭州師范大學(xué)
- 新編大學(xué)生安全教育知到章節(jié)答案智慧樹2023年山東師范大學(xué)
- 心肺復(fù)蘇實(shí)驗(yàn)指導(dǎo)書
- 2021-2022學(xué)年重慶市兩江新區(qū)部編版六年級(jí)上冊(cè)期末素質(zhì)測(cè)查語(yǔ)文試卷(原卷版)
評(píng)論
0/150
提交評(píng)論