C++根据IP与掩码打印所有地址

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>


#define uint unsigned int
#define uchar unsigned char


#define HexPrint(_buf, _len) \
        {\
            int _m_i = 0;\
            char *_m_buf = (char *)(_buf);\
            int _m_len = (int)(_len);\
            printf("[%s:%d] \r\n", __FUNCTION__, __LINE__);\
            printf("***************************************************\n");\
            for(_m_i = 0; _m_i < _m_len; _m_i++)\
            {\
                printf("\033[32m%02x \033[0m", _m_buf[_m_i] & 0xff);\
                if(!((_m_i+1) % 16))  printf("\n");\
            }\
            printf("\nsize = %d\n***************************************************\n", _m_len);\
        }




using namespace std;
int is_ipv4_addr(const char *ip)
{
    if (ip == NULL || ip[0] == '0' || ip[0] == '\0') {
        return -1;
    }

    for (int i = 0, count = 0; i < strlen(ip); i++) {
        if ((ip[i] != '.') && (ip[i] < '0' || ip[i] > '9')) {
            return -1;
        }
        if (ip[i] == '.') {
            count++;
            if (count > 3) {
                return -1;
            }
        }
    }

    int ip_num[4] = {-1, -1, -1, -1};
    char ip_s[4][4];
    memset(ip_s, 0, sizeof(char[4]) * 4);

    sscanf(ip, "%[^.].%[^.].%[^.].%[^ ]", ip_s[0], ip_s[1], ip_s[2], ip_s[3]);
    sscanf(ip_s[0], "%d", &ip_num[0]);
    sscanf(ip_s[1], "%d", &ip_num[1]);
    sscanf(ip_s[2], "%d", &ip_num[2]);
    sscanf(ip_s[3], "%d", &ip_num[3]);

    for (int i = 0; i < 4; i++) {
        if (strlen(ip_s[i]) == 0 || (ip_s[i][0] == '0' && ip_s[i][1] != '\0') || ip_num[i] < 0 || ip_num[i] > 255) {
            return -1;
        }
    }

    return 0;
}


unsigned int ipv4touint(const char* ip)
{
    int a1, a2, a3, a4;
    uint ipint = 0;
    uchar *p = (unsigned char *)&ipint;
    sscanf (ip,"%d.%d.%d.%d",&a1, &a2, &a3, &a4);
    //printf("%d, %d, %d, %d\n",a1,a2,a3,a4 );
    /*
    //法一
    p[0] = a4;
    p[1] = a3;
    p[2] = a2;
    p[3] = a1;
    */


    //法二
    *p = a4;
    p++;
    *p = a3;
    p++;
    *p = a2;
    p++;
    *p = a1;
    
    //printf("%u\n",ipint);


    return ipint;
}


int main()
{
    std::string  ip_mask;
    int count = 0;
    
    std::cout << "请输入IP地址与掩码(A.B.C.D/X):";
    std::cin >> ip_mask;
    //std::cout << ip_mask << std::endl;
    if(ip_mask.find('/') == std::string::npos)
    {    
        std::cout << "ERROR:输入参数不合法!" << std::endl;
        return -1;
    }
    std::string mask = ip_mask.substr(ip_mask.find('/')+1);
    std::string ip = ip_mask.substr(0,ip_mask.find('/'));
    cout << ip <<" " << mask << std::endl;
    
    int intmask = atoi(mask.c_str());
    if(intmask < 0 || intmask > 32)
    {
        std::cout << "ERROR:掩码不合法!" << std::endl;
        return -1;
    }
    if(is_ipv4_addr(ip.c_str()) != 0)
    {
        std::cout << "ERROR:IP地址不合法!" << std::endl;
        return -1;
    }


    //掩码格式转换
    struct in_addr ipaddress;
    uint subnetmask = 0;
    inet_pton(AF_INET, ip.c_str(), &ipaddress);
    for(int i=0,j=31; i<intmask; i++,j--)
    {
        subnetmask =subnetmask+ (1<<j);
    }
    //HexPrint(&ipaddress, sizeof(ipaddress));    
    uint netmask = htonl(subnetmask);
    //HexPrint(&netmask, sizeof(uint));
    uint first_ip = ntohl(ipaddress.s_addr & netmask);
    uint last_ip = ntohl(ipaddress.s_addr | ~(netmask));
    //HexPrint(&first_ip, sizeof(uint));
    std::cout << first_ip << std::endl;
    //HexPrint(&last_ip, sizeof(uint));
    std::cout << last_ip << std::endl;
    uint maxcount = last_ip - first_ip;
    std::cout << "请输入需要遍历的IP地址数量:";
    std::cin >> count;
    if(count >= maxcount)
    {
        std::cout << "ERROR:数量超出给定网络的范围!" << std::endl;
        return -1;
    }
    
    struct in_addr network_addr = {htonl(first_ip)};
    struct in_addr broadcast_addr = {htonl(last_ip)};
    std::cout<<"网络地址:"<< inet_ntoa(network_addr)<<std::endl;    
    std::cout<<"广播地址:"<< inet_ntoa(broadcast_addr)<<std::endl;    


    for(int i = first_ip + 1; i<last_ip && count >= 0; i++)
    {
        unsigned long thisip = htonl(i);
        struct in_addr x = { thisip };
        char buff[16] = {0};
        strcpy(buff, inet_ntoa(x));
        std::cout <<buff <<std::endl;
        count--;
    }
    return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云淡风轻ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值