初识QT 网络类 获取本机IP MAC 等信息

1,qt网络相关类

2,地址含义

3,获取hostip  name信息

4,获取本机IP mac等信息

去除ipv6信息

去除本地回环ip信息

5,tcpserver实例

客户端实例



公司装的是QT5.1.1    自己的电脑目前装的是4.8

所以先看下4.8的相关类和模块

QT 网络相关模块

http://qt-project.org/doc/qt-4.8/qtnetwork.html


To include the definitions of the module's classes, use the following directive:
#include <QtNetwork>


To link against the module, add this line to your qmake .pro file:
 QT += network



QT的网络相关api也是分层设计的

最底层的socket 和server

通用的socket

到最后的HTTP   ftp


常用的

QTcpServer

TCP-based server

QTcpSocket

TCP socket

QUdpSocket

UDP socket

QUrlInfo

Stores information about URLs

QAbstractSocket

The base functionality common to all socket types

QHostAddress

IP address

QHostInfo

Static functions for host name lookups 可以查看回环地址127.0.0.1

QNetworkInterface

Listing of the host's IP addresses and network interfaces查看本机的ip信息

QNetworkAddressEntry

Stores one IP address supported by a network interface, along with its associated netmask and broadcast address




QLocalServer

Local socket based server

QLocalSocket

Local socket

QNetworkConfigurationManager

Manages the network configurations provided by the system

QNetworkReply

Contains the data and headers for a request sent with QNetworkAccessManager

QNetworkRequest

Holds a request to be sent with QNetworkAccessManager



首先回顾几个地址的含义

localhost在计算机网络中,localhost(意为“本地主机”,指“这台计算机”)是给回路网络接口(loopback)的一个标准主机名,相对应的IP地址为127.0.0.1(IPv4)和[::1](IPv6)。 127.x.x.x都是回环地址

广播地址  全1的地址

任何地址 全0  即本网络


QHostAddress::Null 0 The null address object. Equivalent to QHostAddress().
QHostAddress::LocalHost 2 The IPv4 localhost address. Equivalent toQHostAddress("127.0.0.1").
QHostAddress::LocalHostIPv6 3 The IPv6 localhost address. Equivalent to QHostAddress("::1").
QHostAddress::Broadcast 1 The IPv4 broadcast address. Equivalent toQHostAddress("255.255.255.255").
QHostAddress::Any 4 The IPv4 any-address. Equivalent to QHostAddress("0.0.0.0").
QHostAddress::AnyIPv6 5 The IPv6 any-address. Equivalent to QHostAddress("::").





1,查看主机名

http://blog.163.com/soda_water05/blog/static/21283223520121126103955184/


QString localHostName = QHostInfo::localHostName();

qDebug() <<”localHostName: “<<localHostName;

这里我们使用了QHostInfo类的localHostName类来获取本机的计算机名称。

运行程序,在下面的输出栏里的信息如下:

 


2,查看host  ip地址

QHostInfo info = QHostInfo::fromName(localHostName);

qDebug() <<”IP Address: “<<info.addresses();

foreach(QHostAddress address,info.addresses())

{

     if(address.protocol() == QAbstractSocket::IPv4Protocol) 

         qDebug() << address.toString();

}

 

Cpp代码   收藏代码
  1. QString localHostName = QHostInfo::localHostName();  
  2.   
  3. qDebug() <<"localHostName:"<<localHostName;  
  4. QHostInfo info = QHostInfo::fromName(localHostName);    
  5. foreach(QHostAddress address,info.addresses())    
  6. {  
  7.     if(address.protocol() == QAbstractSocket::IPv4Protocol)              
  8.         qDebug() <<"IPV4 Address: "<< address.toString();    
  9. }  


3,根据主机名查看其IP

其实QHostInfo类也可以用来获取任意主机名的IP地址,如一个网站的IP地址。

在这里我们可以使用lookupHost()函数。它是基于信号和槽的,一旦查找到了IP地址,就会触发槽函数。具体用法如下。

我们在widget.h文件中添加一个私有槽函数:


private slots:

void lookedUp(const QHostInfo &host);

然后在widget.cpp中的构造函数中先将上面添加的代码全部删除,然后添加以下代码:

QHostInfo::lookupHost(“www.baidu.com”,

                          this,SLOT(lookedUp(QHostInfo)));

这里我们查询百度网站的IP地址,如果查找到,就会执行我们的lookedUp()函数。

在widget.cpp中添加lookedUp()函数的实现代码:

void Widget::lookedUp(const QHostInfo &host)

{

    qDebug() << host.addresses().first().toString();

}

其实,我们也可以使用lookupHost()函数,通过输入IP地址反向查找主机名,只需要将上面代码中的“www.baidu.com”换成一个IP地址就可以了,如果你有兴趣可以研究一下,不过返回的结果可能不是你想象中的那样。



4,查看本机IP等信息

通过QNetworkInterface类来获取本机的IP地址和网络接口信息。

QNetworkInterface类提供了程序所运行时的主机的IP地址和网络接口信息的列表。

在每一个网络接口信息中都包含了0个或多个IP地址,而每一个IP地址又包含了和它相关的子网掩码和广播地址,

它们三者被封装在一个QNetworkAddressEntry对象中。

网络接口信息中也提供了硬件地址信息。我们将widge.cpp构造函数中以前添加的代码删除,然后添加以下代码。


     QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
         foreach(QNetworkInterface interface,list)
         {
             qDebug() <<"Device:"<<interface.name();
             qDebug() << "HardwareAddress:"<<interface.hardwareAddress();


             QList<QNetworkAddressEntry> entryList = interface.addressEntries();
          //获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址
             foreach(QNetworkAddressEntry entry,entryList)
             {
                 qDebug()<<"IP Address:"<<entry.ip().toString();
                 qDebug()<<"Netmask: "  <<entry.netmask().toString();
                 qDebug()<<"Broadcast:" <<entry.broadcast().toString();
             }
     }


这里我们获取了本机的网络设备的相关信息。运行程序,输出如下:

 

QHostAddress QNetworkAddressEntry::broadcast () const
QHostAddress QNetworkAddressEntry::ip () const
This function returns one IPv4 or IPv6 address found, that was found in a network interface.

QHostAddress QNetworkAddressEntry::netmask () const
IPv4 or IPv6     
255.255.0.0.,QHostAddress holding the address FFFF:FFFF:FFFF:FFFF::

打印的输出:
Device: "lo" 
mac: "00:00:00:00:00:00" 
IP Address: "127.0.0.1" -------------------local host ipv4
Netmask:  "255.0.0.0" ---mask
Broadcast: "127.255.255.255" 

IP Address: "::1" ------------------------LocalHostIPv6
Netmask:  "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF" 
Broadcast: "" 


Device: "eth3" 
mac: "90:E6:BA:78:12:22"

 
Device: "wlan0" 
mac: "1C:4B:D6:12:12:FB" 
IP Address: "192.168.1.103" -------------------ipv4
Netmask:  "255.255.255.0" 
Broadcast: "192.168.1.255" 

IP Address: "F120::112B:D6FF:FE95:B6FB" -----------ipv6
Netmask:  "FFFF:FFFF:FFFF:FFFF::" 
Broadcast: ""

修改下

只打印IPV4的信息  IPV6的不输出

     QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
     QHostAddress address2;
         foreach(QNetworkInterface interface,list)
         {
             qDebug() <<"Device:"<<interface.name();
             qDebug() << "mac:"<<interface.hardwareAddress();


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

             foreach(QNetworkAddressEntry entry,entryList)
             {
                address2=entry.ip();
                 if(address2.protocol() == QAbstractSocket::IPv4Protocol)
                       {
                            qDebug()<<"IPV4 Address:"<<entry.ip().toString();
                            qDebug()<<"Netmask: "  <<entry.netmask().toString();
                            qDebug()<<"Broadcast:" <<entry.broadcast().toString();
                        }
             }
     }


可以看到将回环ip也获取了,去除可参考以下方法

QString str;

  QList<QHostAddress> NetList = QNetworkInterface::allAddresses(); //取得全部信息

  for(int Neti = 0;Neti < NetList.count(); Neti++)
  {
   str = NetList.at(Neti).toString();
   //qDebug()<<str;
   if(str != "127.0.0.1")
    break;
  }



其实,如果我们只想利用QNetworkInterface类来获取IP地址,那么就没必要像上面那样复杂,这个类提供了一个便捷的函数allAddresses()来获取IP地址,例如:

QString address = QNetworkInterface::allAddresses().first().toString();


3.总结。

在这一节中我们学习了如何来查找本机网络设备的相关信息。

其实,以后最常用的还是其中获取IP地址的方法。我们以后可以利用一个函数来获取IP地址:

Cpp代码  收藏代码
  1. QString Widget::getIP()  //获取ip地址  
  2. {  
  3.     QList<QHostAddress> list = QNetworkInterface::allAddresses();  
  4.     foreach (QHostAddress address, list)  
  5.     {  
  6.        if(address.protocol() == QAbstractSocket::IPv4Protocol)  
  7. //我们使用IPv4地址  
  8.             return address.toString();  
  9.     }  
  10.        return 0;  
  11. }  
 


 评论这张
 

4,qtserver 实例127.0.0.1

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QByteArray>
#include <QDataStream>
#include <QDebug>
#include <QNetworkInterface>
 #include <QList>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->listened=false;
     tcpServer = new QTcpServer(this);
     ui->pushButton_listen->setText("listen");

     QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();
         foreach(QNetworkInterface interface,list)
         {
             qDebug() <<"Device:"<<interface.name();
             qDebug() << "HardwareAddress:"<<interface.hardwareAddress();


             QList<QNetworkAddressEntry> entryList = interface.addressEntries();
          //获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址
             foreach(QNetworkAddressEntry entry,entryList)
             {
                 qDebug()<<"IP Address:"<<entry.ip().toString();
                 qDebug()<<"Netmask: "  <<entry.netmask().toString();
                 qDebug()<<"Broadcast:" <<entry.broadcast().toString();
             }
     }


}

MainWindow::~MainWindow()
{
    delete ui;
}


// -------------------------listen-----
void MainWindow::on_pushButton_listen_clicked()
{

    if( ui->pushButton_listen->text()=="listen")
    {
        if(!tcpServer->listen(QHostAddress::LocalHost,ui->lineEdit_port->text().toUInt()))
            {
                qDebug() << tcpServer->errorString();
                this->listened=false;
                tcpServer->close();
            }else
        {
             ui->textEdit_tx->append("creat server successful!!!");
             ui->textEdit_tx->append("server listening---");
             ui->lineEdit_ip->setText(tcpServer->serverAddress().toString());
             this->listened=true;
             netinfor= QHostInfo::fromName(QHostInfo::localHostName());
             ui->textEdit_infor->append("local hostname:"+netinfor.localHostName());
             ui->textEdit_infor->append("local domainname:"+netinfor.localDomainName());

             foreach(QHostAddress address,netinfor.addresses())
             {
                  if(address.protocol() == QAbstractSocket::IPv4Protocol)
                   ui->textEdit_infor->append("host ip addr:"+address.toString());
             }
              connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newClient()));
              ui->pushButton_listen->setText("stop");
        }


   }else
    {
        clientConnection->disconnectFromHost();   //disconnect
        ui->textEdit_infor->append("stop listen----");
        ui->pushButton_listen->setText("listen");
        tcpServer->close();
    }

}
//----------------------new client---------------
void MainWindow::newClient()
{
        ui->textEdit_infor->append("new  connecter connected");
        clientConnection = tcpServer->nextPendingConnection(); //creat new socket if connect
        ui->textEdit_infor->append("new  connecter connected");
        ui->textEdit_infor->append("peer name:"+clientConnection->peerName());
        ui->textEdit_infor->append("peer ip:"+clientConnection->peerAddress().toString());
        connect(clientConnection,SIGNAL(disconnected()),clientConnection, SLOT(deleteLater()));
}
//----------------------send data---------
void MainWindow::sendMessage()
{
    QByteArray block1;
    QDataStream out1(&block1,QIODevice::WriteOnly);
    out1.setVersion(QDataStream::Qt_4_6);
    if(this->listened)
    {
        out1<<(quint16) 0;
        out1<<ui->textEdit_tx->toPlainText().trimmed();
        out1.device()->seek(0);
        out1<<(quint16) (block1.size()-sizeof(qint16));

        clientConnection->write(block1);           //send data
        ui->textEdit_infor->append("send message successful!!!");
    }

}
void MainWindow::on_pushButton_send_clicked()
{
    this->sendMessage();
}

5,客户端实例

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket(this);
    in = new QDataStream(tcpSocket);
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));

    connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
             this,SLOT(displayError(QAbstractSocket::SocketError)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void  MainWindow::newConnect()
{
    blockSize = 0; //初始化其为0
    tcpSocket->abort();         //取消已有的连接
    tcpSocket->connectToHost(ui->lineEdit_ip->text(),ui->lineEdit_port->text().toInt()); //connect
}


void  MainWindow::readMessage()
{

    in->setVersion(QDataStream::Qt_4_6);    //设置数据流版本,这里要和服务器端相同
    if(blockSize==0) //如果是刚开始接收数据
    {
        //判断接收的数据是否有两字节,也就是文件的大小信息
        //如果有则保存到blockSize变量中,没有则返回,继续接收数据
        if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;
        *in >> blockSize;
    }

    if(tcpSocket->bytesAvailable() < blockSize) return;      //如果没有得到全部的数据,则返回,继续接收数据

    *in >> message;      //将接收到的数据存放到变量中
    ui->textEdit_rx->append(message);     //show what received
}

void  MainWindow::displayError(QAbstractSocket::SocketError)
{
    qDebug() << tcpSocket->errorString(); //print err infor
}

void MainWindow::on_pushButton_connect_clicked()
{
    this->newConnect();   //connect  to server
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值