首页 > 代码库 > IP地址分类
IP地址分类
IP Address Classification
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.
Please determine the class of an input IP address and obtain the corresponding IP address information according to the input 32-bit IP address.
For IP addresses of A, B, and C classes, the network number and host number are required. For class D addresses, the multicast address is required. Class E addresses are reserved for future use and do not require the network number, host number, or multicast address.
#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;/***************************************************************************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: 成功****************************************************************************/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; }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。