#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);
*p = a4;
p++;
*p = a3;
p++;
*p = a2;
p++;
*p = a1;
return ipint;
}
int main()
{
std::string ip_mask;
int count = 0;
std::cout << "请输入IP地址与掩码(A.B.C.D/X):";
std::cin >> ip_mask;
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);
}
uint netmask = htonl(subnetmask);
uint first_ip = ntohl(ipaddress.s_addr & netmask);
uint last_ip = ntohl(ipaddress.s_addr | ~(netmask));
std::cout << first_ip << std::endl;
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;
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律