获取本机IP地址,相信初学者人人都会,最简单的方法就是QNetworkInterface::allAddresses()[0].toString(),获取网卡更详细的可以看这里:
http://blog.sina.com.cn/s/blog_a6fb6cc90102v0mz.html。
如何获取外网IP,一般操作
系统不自带这样的命令,需要通过特殊的网页获取,例如ip168,我这里用的是
http://whois.pconline.com.cn/,通过打开网页,获取所有源代码,然后分割字符串,取出对应字符串处的本机外网IP地址即可。此方法屡试不爽,什么编程语言都可以采用此方法!

至于检测是否通外网,很多人首先想到的是检测ping命令,然后看结果,这个方法速度
比较慢,我想的方法就是直接用tcp连接百度的IP地址的80端口,如果100毫秒之内可以连上说明通外网。
源码
下载:
IPTool.zip (3 K) 下载次数:424 百度云下载: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");
- }