liudianwu |
2015-04-14 10:33 |
QT编写获取外网IP和检测是否通外网工具
获取本机IP地址,相信初学者人人都会,最简单的方法就是QNetworkInterface::allAddresses()[0].toString(),获取网卡更详细的可以看这里:http://blog.sina.com.cn/s/blog_a6fb6cc90102v0mz.html。 如何获取外网IP,一般操作系统不自带这样的命令,需要通过特殊的网页获取,例如ip168,我这里用的是http://whois.pconline.com.cn/,通过打开网页,获取所有源代码,然后分割字符串,取出对应字符串处的本机外网IP地址即可。此方法屡试不爽,什么编程语言都可以采用此方法! [attachment=13566] 至于检测是否通外网,很多人首先想到的是检测ping命令,然后看结果,这个方法速度比较慢,我想的方法就是直接用tcp连接百度的IP地址的80端口,如果100毫秒之内可以连上说明通外网。 源码下载:[attachment=13567] 百度云下载:http://pan.baidu.com/s/1ntHtxrj
- #include "widget.h"
#include "ui_widget.h" #include <QtNetwork>
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); }
Widget::~Widget() { delete ui; }
//判断IP地址及端口是否在线 bool Widget::IPLive(QString ip, int port) { QTcpSocket tcpClient; tcpClient.abort(); tcpClient.connectToHost(ip, port); //100毫秒没有连接上则判断不在线 return tcpClient.waitForConnected(100); }
//获取网页所有源代码 QString Widget::GetHtml(QString url) { QNetworkAccessManager *manager = new QNetworkAccessManager(); QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url))); QByteArray responseData; QEventLoop eventLoop; QObject::connect(manager, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit())); eventLoop.exec(); responseData = reply->readAll(); return QString(responseData); }
//获取本机公网IP地址 QString Widget::GetNetIP(QString webCode) { QString web = webCode.replace(" ", ""); web = web.replace("\r", ""); web = web.replace("\n", ""); QStringList list = web.split("<br/>"); QString tar = list[3]; QStringList ip = tar.split("="); return ip[1]; }
void Widget::on_btnGetLocalIP_clicked() { ui->txtLocalIP->setText(QNetworkInterface::allAddresses()[0].toString()); }
void Widget::on_btnGetWebIP_clicked() { ui->txtWebIP->setText(GetNetIP(GetHtml("http://whois.pconline.com.cn/"))); }
void Widget::on_btnCheckWeb_clicked() { //能接通百度IP说明可以通外网 bool ok=IPLive("202.108.22.5", 80); ui->txtCheckWeb->setText(ok?"true":"false"); }
|
|