6.2.1 计算指定子网内包含的所有IP地址
例6.7
1.声明头文件
2.判断命令行参数的数量
3.判断IP地址是否合法
4.计算网络地址和广播地址
5.显示IP地址的数量和列表
// CalculateSubnet.cpp -- 计算指定子网内包含的所有的IP地址
#pragma warning(disable:4996)
#include "Winsock2.h"
#include <string>
#include <ctype.h>
#pragma comment(lib, "Ws2_32.lib")
/**
* bool IsValidIP(char* ip)
* 功能:判断指定的IP地址是否有效。
* 1. 字符串中必须包含3个符号"."
* 2. 被符号"."分隔的字符串必须小于或等于3
* 3. 被符号"."分隔的字符串必须可以转换成不大于255的整数。
**/
bool IsValidIP(char* ip)
{
std::string sip = ip;
for (int judgeTimes = 1; judgeTimes <= 4; ++judgeTimes) {
int pos = (int)sip.find_first_of("."); // 找下一个句点
if (0 == pos) {
return false;
}
std::string subip = sip.substr(0, pos); // 将ip分割为左边有效的地方
sip = sip.substr(pos + 1, sip.length() - pos); // 将ip分割为右边有效的地方
if (subip.length() > 3) { // 长度必须不大于3
return false;
}
for (int i = 0; i < (int)subip.length(); i++) { // 检查是否满足全为数字的条件
if (!isdigit(subip[i])) {
return false;
}
}
int a = atoi(subip.c_str()); // 检查数字是否在取值范围内
if (1 == judgeTimes && (a < 1 || a > 255)) {
return false;
}
else if ((2 == judgeTimes || 3 == judgeTimes) && a > 255) {
return false;
}
else if (4 == judgeTimes && a > 254) {
return false;
}
}
return true;
}
int main()
{
const int argc = 3;
char _ta[] = "";
char _tb[] = "192.168.0.1";
char _tc[] = "255.255.255.0";
char* argv[] = { _ta, _tb, _tc };
if (argc != 3) {
printf("Usage: CalculateSubnet netaddr netmask\r\nExample: CalculateSubnet 192.168.0.0 255.255.255.0\n");
return 1;
}
if (!IsValidIP(argv[1])) {
printf("%s is not a valid ip.\n", argv[1]);
return 1;
}
if (!IsValidIP(argv[2])) {
printf("%s is not a valid ip.\n", argv[2]);
return 1;
}
printf("计算指定子网内包含的所有的IP地址\n");
printf("netaddr: %s\n", argv[1]);
printf("netmask: %s\n", argv[2]);
unsigned long lnetaddr = ntohl(inet_addr(argv[1])); // IP地址
unsigned long lnetmask = ntohl(inet_addr(argv[2])); // 子网掩码
unsigned long l_first_netaddr = lnetaddr & lnetmask; // 子网地址=IP地址&子网掩码
unsigned long l_broadcast = lnetaddr | ~lnetmask; // 广播地址=IP地址|~子网掩码
// 计算子网中包含有效IP地址的数量
long num = l_broadcast - l_first_netaddr - 1;
printf("Number of valid IPs: %d\n\n", num);
printf("IPs in subnet: \n=============\n");
for (unsigned long i = l_first_netaddr + 1; i < l_broadcast; i++) {
in_addr IPAddr;
IPAddr.S_un.S_addr = ntohl(i);
printf("%s\n", inet_ntoa(IPAddr));
}
system("pause");
return 0;
}