判断用户输入IP的合法性&判断输入IP与本机IP是否在同一网段C++&QT

目录

一、任务目标

二、判断用户输入IP的合法性

三、判断用户输入IP与本机IP是否在同一网段


一、任务目标

1、判断用户输入IP的合法性,例如是否不符合IP地址的正确格式;

2、判断用户输入IP与本机IP是否在同一网段;

3、使用C++和QT实现;

二、判断用户输入IP的合法性

cpp 复制代码
#include <iostream>
#include <string>
#include <sstream>
#include <vector>

bool isValidIPAddress(const std::string& ipAddress) {
    std::vector<int> ipSegments;
    std::istringstream iss(ipAddress);
    std::string segment;
    
    while (std::getline(iss, segment, '.')) {
        try {
            int value = std::stoi(segment);
            if (value < 0 || value > 255) {
                return false;
            }
            ipSegments.push_back(value);
        } catch (const std::exception& e) {
            return false;
        }
    }
    
    return ipSegments.size() == 4;
}

int main() {
    std::string text = "192.168.1.3:502";
    size_t delimiterPos = text.find(':');
    std::string ipAddress = delimiterPos != std::string::npos ? text.substr(0, delimiterPos) : text;
    
    if (isValidIPAddress(ipAddress)) {
        std::cout << "The IP address is valid." << std::endl;
    } else {
        std::cout << "The IP address is invalid." << std::endl;
    }
    
    return 0;
}

三、判断用户输入IP与本机IP是否在同一网段

cpp 复制代码
//使用Visual Studio
//项目属性->"Qt Project Settings"->"Qt Modules"->勾选"network"
#include <QtNetwork/QNetworkInterface>
#include <QtNetwork/QNetworkAddressEntry>
#include <QtNetwork/QAbstractSocket>

//获取本机IP
QHostAssress hostIP()
{
    auto list = QNetworkInterface::allInterfaces();
    foreach(QNetworkInterface interface,list)
    {
        //1、首先判断是不是以太网,过滤Wifi
        if(interface.type() != QNetworkInterface::Ethernet)
            continue;

        //2、如果有安装虚拟机VMware,会出现虚拟网卡,需要过滤
        if(interface.humanReadableName().contains("VMware"))
            continue;

        //3、一般会有两个IP地址,一ipv4一个ipv6,过滤ipv6
        foreach(auto entry,interface.addressEntries())
        {
            if(entry.ip().protocol() == QAbstractSocket::IPv4Protocol)
                return entry.ip();
        }
    }
    return QHostAddress();
}

int main()
{
    //获取本机IP
    QHostAddress LocalIP = hostIP();
    QString ipAddress = LocalIP.toString();
    std::string text = ipAddress.toStdString();
    //获取本机网段值
    int extractedInt = -1;
    std::string delimiter = ".";
    std::vector<std::string> tokens;
    std::string token;
    std::istringstream tokenStream(text);

    while (std::getline(tokenStream, token, '.')) {
        tokens.push_back(token);
    }

    if (tokens.size() >= 3) {
        std::string extracted = tokens[2];
        extractedInt = std::stoi(extracted);
    }

    //获取用户输入IP的网段值
    std::string InputIP = "192.168.1.3:502";
    int extractedInt2 = -2;
    std::vector<std::string> tokens2;
    std::string token2;
    std::istringstream tokenStream2(InputIP);

    while (std::getline(tokenStream2, token2, '.')) {
        tokens2.push_back(token2);
    }

    if (tokens2.size() >= 3) {
        std::string extracted2 = tokens2[2];
        extractedInt2 = std::stoi(extracted2);
    }

    //判断用户输入的IP是否与本机IP在同一网段
    if(extractedInt == extractedInt2)
    {
        std::cout<<"在同一网段"<<std::endl;
    }
    else
    {
        std::cout<<"不在同一网段"<<std::endl;
    }
    
    return 0;
}

上述两项功能可以结合在一起使用,在"判断用户输入IP的合法性"后"判断用户输入IP与本机IP是否在同一网段"。

上述功能因笔者使用场景为QT的交互界面所以用到了QT的QtNetwork模块。

//上述代码为笔者在网页编写,如有错误望及时提出,感谢!

相关推荐
Sugobet44 分钟前
【安卓][Mac/Windows】永久理论免费 无限ip代理池 - 适合临时快速作战
android·tcp/ip·macos·网络安全·渗透测试·ip代理池·接入点
Simple_core1 小时前
qt贝塞尔曲线演示工具
开发语言·qt
sannianji1 小时前
qt 采用movetothread在应用程序gui关闭时如何正确退出。
开发语言·qt
幽迷狂4 小时前
AFSIM入门教程03.03:更新所有依赖库版本
c++·qt·仿真·osgearth·osg·军事·afsim
勇闯逆流河4 小时前
【C++】Stack and Queue and Functor
开发语言·c++
TravisBytes7 小时前
gRPC C++ 从 0 到 1 → 到线上:**超详细** 环境搭建、编码范式、性能调优与 DevOps 全攻略
开发语言·c++·devops
CUC-MenG9 小时前
2025牛客多校第六场 D.漂亮矩阵 K.最大gcd C.栈 L.最小括号串 个人题解
c语言·c++·算法·矩阵
Liuqz20099 小时前
VSCode中使用Qt
ide·vscode·qt
千码君20169 小时前
计算机网络:如何将一个B类IP地址分为4个子网
网络·tcp/ip·计算机网络·子网掩码·借位计算·子网位·与运算
2401_876221349 小时前
Tasks and Deadlines(Sorting and Searching)
c++·算法