——————dnsserver.h——————
#ifndef DNSSERVER_H
#define DNSSERVER_H
#include <QWidget>
#include <QByteArray>
#include<QtNetwork>
#include <QDnsServiceRecord>
#include<QDnsLookup>
#include<QHostAddress>
namespace Ui {
class DNSServer;
}
class DNSServer : public QWidget
{
Q_OBJECT
public:
explicit DNSServer(QWidget *parent = 0);
~DNSServer();
void FirstStart();
void Sent(QHostAddress);
void DNSSearch(QString);
public slots:
void DNSRead();
void DNSFind();
private slots:
void on_pushButton_clicked();
private:
Ui::DNSServer *ui;
QUdpSocket *UDPReceiver;
QUdpSocket *UDPSender;
QDnsLookup *DnsLookup;
};
#endif // DNSSERVER_H
——————dnsserver.cpp————————
#include "dnsserver.h"
#include "ui_dnsserver.h"
DNSServer::DNSServer(QWidget *parent) :
QWidget(parent),
ui(new Ui::DNSServer)
{
ui->setupUi(this);
DNSServer::FirstStart();
}
DNSServer::~DNSServer()
{
delete ui;
}
void DNSServer::FirstStart()
{
UDPReceiver=new QUdpSocket(this);
UDPReceiver->bind(QHostAddress::LocalHost,53);
connect(UDPReceiver,SIGNAL(readyRead()),this,SLOT(DNSRead()));
UDPSender=new QUdpSocket(this);
}
void DNSServer::DNSRead()
{
while(UDPReceiver->hasPendingDatagrams())
{
QByteArray datagram;
QString str="";
datagram.resize(UDPReceiver->pendingDatagramSize());
UDPReceiver->readDatagram(datagram.data(),datagram.size());
//这个for循环如果有比较好的办法会更好
for(int i=0;i<datagram.size();i++)
{
if(i<13)
continue;
else
{
char c=datagram.at(i);
if(c==0x00||c==0x01)
continue;
else if(c==0x02||c==0x03||c==0x04||c==0x05||c==0x06||c==0x07||c==0x08||c==0x09)
str.append(".");
else
str.append(c);
}
}
ui->lineEdit->setText(str);
DNSServer::DNSSearch(str);
}
}
void DNSServer::DNSSearch(QString text)
{
DnsLookup=new QDnsLookup(this);
DnsLookup->connect(DnsLookup,SIGNAL(finished()),this,SLOT(DNSFind()));
QHostAddress address("114.114.114.114");
DnsLookup->setName(text);
DnsLookup->setType(QDnsLookup::A);
DnsLookup->setNameserver(address);
DnsLookup->lookup();
}
void DNSServer::DNSFind()
{
if(DnsLookup->error() != QDnsLookup::NoError)
return;
bool find=false;
foreach (const QDnsHostAddressRecord &record, DnsLookup->hostAddressRecords())
{
QHostAddress hostAddress=record.value();
ui->lineEdit_2->setText(hostAddress.toString());
if(!find)
{
DNSServer::Sent(hostAddress);
find=true;
}
}
DnsLookup->deleteLater();
}
void DNSServer::Sent(QHostAddress address)
{
//从这里就开始郁闷。
QHostAddress local("127.0.0.1");
QString temp=address.toString();
QByteArray byte=temp.toLatin1();
UDPSender->writeDatagram(byte,byte.size(),local,UDPReceiver->peerPort());
}
void DNSServer::on_pushButton_clicked()
{
DNSServer::DNSSearch(ui->lineEdit->text());
}