QT访问本机IP地址

问题描述:

在QT中访问主机IP,为何只获得了127.0.0.1虚拟IP地址,无法理解~~~

学习背景

QT中访问主机IP地址主要使用两个类:QHostInfo与QNetworkInterface类

1.QHostInfo类访问主机IP地址代码:


    QString hostName=QHostInfo::localHostName();//主机信息查询:返回本机主机名


    //测试
    //qDebug()<< "本地DNS域名:"<<hostName<<"\n";//hostName="localhost.localdomain"主机名称

    QHostInfo  hostInfo=QHostInfo::fromName(hostName);//通过主机名称,获取IP地址,返回一个hostInfo类
    QString    localIP="";//本地IP地址string数组
    QList<QHostAddress> addList=hostInfo.addresses();//创建一个QList对象,容器内部存储QHostAddress类型的数据,返回一个address数组,QHostAddress类提供一个IP地址的信息,包括IPv4和Ipv

    //返回一个与hostname关联的IP地址列表,该列表可能为空
    //测试
    //qDebug()<<hostInfo.addresses();
    //测试
    //for (int i=0;i<addList.count();i++)
    //{
    //qDebug()<<addList.at(i);
    //}
    //返回的address是QHostAddress类的列表,QHostAddress类提供一个IP地址的信息,包括IPv4和IPv6地址

    if (!addList.isEmpty())
    {
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i);//访问指定位置的元素
        //测试
        //qDebug()<<aHost.toString();
        if (QAbstractSocket::IPv4Protocol==aHost.protocol())  //protocol()返回IP地址的协议类型,并且只返回IPv4的地址
        {
            localIP=aHost.toString();//返回IP地址的字符串
            break;
        }
    }
}

注:此方法在默认情况下返回的IP地址为127.0.0.1,此地址为虚拟地址(本地环回地址),即只能通过TCP与本机通信。(原因是:在虚拟机中默认域名是localhost,localhost默认的IP地址为127.0.0.1、::1),如下图所示为localhost.localdomain文件配置,默认的IP地址

2.QNetworkInterface类访问主机IP地址代码<Qnetwork>:

QList<QNetworkInterface> list=QNetworkInterface::allInterfaces();//获取网络接口

for(int i=0;i<list.count();i++)

{

QNetworkInterface aInterface=list.at(i);

qDebug()<<"设备名称:"<<aInterface.humanReadableName(); //显示每个接口的设备名称

qDebug()<<"硬件地址:"<<aInterface.hardwareAddress(); //显示每个接口的硬件地址

QList<QNetworkAddressEntry> entryList=aInterface.addressEntries();

for(int j=0;j<entryList.count();j++)

{

QNetworkAddressEntry aEntry=entryList.at(j);

qDebug()<<"IP地址:"+aEntry.ip().toString();

}

}

Lo表示环回接口;

Ens33表示以太网卡

Virbr0表示虚拟网桥网卡

因此,本虚拟机的IP地址应该为192.168.88.139

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt5.6 中使用硬件地址访问网络,可以使用 QNetworkInterface 类来获取本机的网络接口信息,包括网络接口的名称、硬件地址、IP 地址等。 以下是一个示例代码,展示了如何使用 QNetworkInterface 获取本机的网络接口信息,并使用硬件地址访问网络: ```cpp #include <QtNetwork> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 获取本机的网络接口信息 QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces(); // 遍历网络接口,找到指定的网络接口 foreach (QNetworkInterface interface, interfaces) { if (interface.name() == "eth0") { // 指定网络接口名称 // 获取网络接口的硬件地址 QByteArray mac = interface.hardwareAddress(); // 构造一个 UDP 数据包 QUdpSocket socket; QByteArray datagram = "Hello, world!"; QHostAddress address("192.168.1.100"); quint16 port = 1234; // 设置 UDP 数据包的目的地址和端口 socket.writeDatagram(datagram, address, port); // 设置 UDP 数据包的源地址为本机的硬件地址 socket.setSocketOption(QAbstractSocket::MulticastTtlOption, mac); break; } } return app.exec(); } ``` 在上面的代码中,我们首先使用 QNetworkInterface::allInterfaces() 函数获取本机的所有网络接口信息。然后遍历网络接口列表,找到指定的网络接口(这里我们假设要使用名为 "eth0" 的网络接口)。接着,我们使用 QNetworkInterface::hardwareAddress() 函数获取该网络接口的硬件地址,并将其作为 UDP 数据包的源地址。最后,我们使用 QUdpSocket 类发送 UDP 数据包,将其目的地址设置为指定的 IP 地址和端口。 需要注意的是,上述代码中的硬件地址是以 QByteArray 的形式存储的,需要根据具体的网络协议进行转换。另外,如果要使用 TCP 协议访问网络,可以使用 QTcpSocket 类,并设置其源地址和端口号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值