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
常用的
TCP-based server | |
TCP socket | |
UDP socket | |
Stores information about URLs |
The base functionality common to all socket types |
IP address |
Static functions for host name lookups 可以查看回环地址127.0.0.1 |
Listing of the host's IP addresses and network interfaces查看本机的ip信息 |
Stores one IP address supported by a network interface, along with its associated netmask and broadcast address |
Local socket based server | |
Local socket |
Manages the network configurations provided by the system |
Contains the data and headers for a request sent with QNetworkAccessManager | |
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();
}
- QString localHostName = QHostInfo::localHostName();
- qDebug() <<"localHostName:"<<localHostName;
- QHostInfo info = QHostInfo::fromName(localHostName);
- foreach(QHostAddress address,info.addresses())
- {
- if(address.protocol() == QAbstractSocket::IPv4Protocol)
- qDebug() <<"IPV4 Address: "<< address.toString();
- }
其实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地址和网络接口信息。
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
}