IP地址分类
IP Address Classification0、概要An IP address is 32-bit long. IP addresses are classified into A,B,C,D,and E classes,as shown in the figure below. 1.A类地址:1.0.0.0~127.255.255.255 这样A类地址就仅仅有1.0.0.0~9.255.255.255和11.0.0.0~126.255.255.255能够正经常使用了。 2.B类地址:128.1.0.0~191.255.255.255 3.C类地址:192.0.1.0~223.255.255.255 4.D类地址:224.0.0.0~ 239. 255. 255.255 5.E类地址:240.0.0.0~255.255.255.255 1、要求/*************************************************************************** Description IP地址长32bit,可分为A/B/C/D/E 5类地址。不同五类地址格式定义见题目描写叙述中的附图。 请依据输入的32bit IP地址,推断IP地址的类别,并获得相应的IP地址信息。 当中A/B/C类地址。须要获得网络号和主机号。D类地址须要获得多播组号。E类地址不涉及。 Prototype int GetIpAddressInfo(unsigned int unIpAddr,IpAddressInfoStru* pAddrInfo) Input Param unsigned int unIpAddr: Ip 地址 Output Param IpAddressInfoStru* pAddrInfo: IP地址信息的结果。IpAddressInfoStru參加定义 当中:nType 为地址类别。请按枚举IP_ADDR_TYPE返回。stCompose 为网络号和主机号的结构定义。在A/B/C类地址的时候须要返回。 nMultiBoardNo 为多播组号。在D类地址的时候须要返回。 Return Value int -1: 失败 0: 成功 ****************************************************************************/ 2、方法一#include <stdio.h> #include <bitset> using std::bitset; /*IP地址类别*/ typedef enum { IP_ADDR_TYPE_A,/* A类IP地址*/ IP_ADDR_TYPE_B,/* B类IP地址*/ IP_ADDR_TYPE_C,/* C类IP地址*/ IP_ADDR_TYPE_D,/* D类IP地址*/ IP_ADDR_TYPE_E /* E类IP地址*/ }IP_ADDR_TYPE; typedef struct { int nNetworkNo; /* 网络号*/ int nHostNo; /* 主机号*/ }IpComposeStru; typedef struct { int nType; /*IP地址类型*/ union { IpComposeStru stCompose; /*IP地址子信息*/ int nMultiBoardNo; /*多播组号*/ }IpSubsetInfo; }IpAddressInfoStru; // 方法1 int GetIpAddressInfo(unsigned int unIpAddr,IpAddressInfoStru* pAddrInfo) { /*在这里实现功能*/ if (pAddrInfo == NULL) { return -1; } bitset<32> bitIpAddr = 0; bitIpAddr = unIpAddr; if (!bitIpAddr.test(31)) { pAddrInfo->nType = IP_ADDR_TYPE_A; bitset<7> bitNetworkNo; for (int i = 0; i < 7; i++) { bitNetworkNo[i] = bitIpAddr[24 + i]; } bitset<24> bitHostNo; for (int i = 0; i < 24; i++) { bitHostNo[i] = bitIpAddr[i]; } pAddrInfo->IpSubsetInfo.stCompose.nNetworkNo = bitNetworkNo.to_ulong(); pAddrInfo->IpSubsetInfo.stCompose.nHostNo = bitHostNo.to_ulong(); return 0; } else if (!bitIpAddr.test(30)) { pAddrInfo->nType = IP_ADDR_TYPE_B; bitset<14> bitNetworkNo; for (int i = 0; i < 14; i++) { bitNetworkNo[i] = bitIpAddr[16 + i]; } bitset<16> bitHostNo; for (int i = 0; i < 16; i++) { bitHostNo[i] = bitIpAddr[i]; } pAddrInfo->IpSubsetInfo.stCompose.nNetworkNo = bitNetworkNo.to_ulong(); pAddrInfo->IpSubsetInfo.stCompose.nHostNo = bitHostNo.to_ulong(); return 0; } else if (!bitIpAddr.test(29)) { pAddrInfo->nType = IP_ADDR_TYPE_C; bitset<21> bitNetworkNo; for (int i = 0; i < 21; i++) { bitNetworkNo[i] = bitIpAddr[8 + i]; } bitset<8> bitHostNo; for (int i = 0; i < 8; i++) { bitHostNo[i] = bitIpAddr[i]; } pAddrInfo->IpSubsetInfo.stCompose.nNetworkNo = bitNetworkNo.to_ulong(); pAddrInfo->IpSubsetInfo.stCompose.nHostNo = bitHostNo.to_ulong(); return 0; } else if (!bitIpAddr.test(28)) { pAddrInfo->nType = IP_ADDR_TYPE_D; bitset<28> bitMultiBoardNo; for (int i = 0; i < 28; i++) { bitMultiBoardNo[i] = bitIpAddr[i]; } pAddrInfo->IpSubsetInfo.nMultiBoardNo = bitMultiBoardNo.to_ulong(); return 0; } else if (!bitIpAddr.test(27)) { pAddrInfo->nType = IP_ADDR_TYPE_E; return 0; } } 3、方法二#include <stdio.h> /*IP地址类别*/ typedef enum { IP_ADDR_TYPE_A,/* D类IP地址*/ IP_ADDR_TYPE_E /* E类IP地址*/ }IP_ADDR_TYPE; typedef struct { int nNetworkNo; /* 网络号*/ int nHostNo; /* 主机号*/ }IpComposeStru; typedef struct { int nType; /*IP地址类型*/ union { IpComposeStru stCompose; /*IP地址子信息*/ int nMultiBoardNo; /*多播组号*/ }IpSubsetInfo; }IpAddressInfoStru; //方法2 int GetIpAddressInfo(unsigned int unIpAddr,IpAddressInfoStru* pAddrInfo) { /*在这里实现功能*/ if (pAddrInfo == NULL) { return -1; } if (!((unIpAddr)&(0x80000000))) { pAddrInfo->nType = IP_ADDR_TYPE_A; unsigned int bitNetworkNo; unsigned int bitHostNo; unsigned int bittemp = unIpAddr; bitHostNo = bittemp&(0x00FFFFFF); bitNetworkNo = bittemp>>24; pAddrInfo->IpSubsetInfo.stCompose.nNetworkNo = bitNetworkNo; pAddrInfo->IpSubsetInfo.stCompose.nHostNo = bitHostNo; return 0; } else if (!((unIpAddr)&(0x40000000))) { pAddrInfo->nType = IP_ADDR_TYPE_B; unsigned int bitNetworkNo; unsigned int bitHostNo; unsigned int bittemp = unIpAddr; bitHostNo = bittemp&(0x0000FFFF); bitNetworkNo = ((bittemp>>16)&(0x00003FFF)); pAddrInfo->IpSubsetInfo.stCompose.nNetworkNo = bitNetworkNo; pAddrInfo->IpSubsetInfo.stCompose.nHostNo = bitHostNo; return 0; } else if (!((unIpAddr)&(0x20000000))) { pAddrInfo->nType = IP_ADDR_TYPE_C; unsigned int bitNetworkNo; unsigned int bitHostNo; unsigned int bittemp = unIpAddr; bitHostNo = bittemp&(0x000000FF); bitNetworkNo = ((bittemp>>8)&(0x001FFFFF)); pAddrInfo->IpSubsetInfo.stCompose.nNetworkNo = bitNetworkNo; pAddrInfo->IpSubsetInfo.stCompose.nHostNo = bitHostNo; return 0; } else if (!((unIpAddr)&(0x10000000))) { pAddrInfo->nType = IP_ADDR_TYPE_D; unsigned int bitMultiBoardNo; unsigned int bittemp = unIpAddr; bitMultiBoardNo = bittemp&(0x0FFFFFFF); pAddrInfo->IpSubsetInfo.nMultiBoardNo = bitMultiBoardNo; return 0; } else if (!((unIpAddr)&(0x08000000))) { pAddrInfo->nType = IP_ADDR_TYPE_E; return 0; } return -1; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |