6.2 扫描子网中的地址

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值