00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <QTcpSocket>
00029 #include <QHostInfo>
00030 #include <QList>
00031 #include <QUrl>
00032
00033 #include "net.h"
00034 #include "http.h"
00035
00036
00037
00038 QHostAddress
00039 net_local_address()
00040 {
00041 QHostInfo localInfo = QHostInfo::fromName(QHostInfo::localHostName());
00042 if (localInfo.error() == QHostInfo::NoError) {
00043 foreach (QHostAddress addr, localInfo.addresses()) {
00044 if (addr.protocol() == QAbstractSocket::IPv4Protocol &&
00045 !(addr == QHostAddress::LocalHost)) {
00046 return addr;
00047 }
00048 }
00049 }
00050 return QHostAddress::LocalHost;
00051 }
00052
00053
00054 bool
00055 net_is_private_address(QHostAddress addr)
00056 {
00057 quint32 ip = addr.toIPv4Address();
00058
00059 return (((ip & 0xFF000000) == 0x00000000) ||
00060 ((ip & 0xFF000000) == 0x0A000000) ||
00061 ((ip & 0xFF000000) == 0x7F000000) ||
00062 ((ip & 0xFFF00000) == 0xAC100000) ||
00063 ((ip & 0xFFFF0000) == 0xA9FE0000) ||
00064 ((ip & 0xFFFF0000) == 0xC0A80000));
00065 }
00066
00067
00068
00069 bool
00070 net_is_valid_ip(QString ip)
00071 {
00072 return QHostAddress().setAddress(ip);
00073 }
00074
00075
00076
00077 QList<QUrl>
00078 get_check_ip_sites()
00079 {
00080 static QList<QUrl> sites;
00081 if (sites.count() == 0) {
00082 sites.append(QUrl("http://ipid.shat.net/iponly/"));
00083 sites.append(QUrl("http://freehaven.net/~edmanm/ip.php"));
00084 sites.append(QUrl("http://vidalia-project.net/iptest/ip.php"));
00085 } else {
00086 sites.append(sites.takeFirst());
00087 }
00088 return sites;
00089 }
00090
00091
00092
00093
00094
00095
00096 bool
00097 net_get_public_ip(QString &ip)
00098 {
00099 QList<QUrl> sites = get_check_ip_sites();
00100 foreach (QUrl site, sites) {
00101 Http http(site.host());
00102 if (http.request(site.path())) {
00103 if (net_is_valid_ip(http.body())) {
00104 ip = http.body();
00105 return true;
00106 }
00107 }
00108 }
00109 return false;
00110 }
00111
00112
00113
00114 bool
00115 net_test_connect(QHostAddress host, quint16 port, int timeout)
00116 {
00117 QTcpSocket sock;
00118 sock.connectToHost(host, port);
00119 if (!sock.waitForConnected(timeout)) {
00120 return false;
00121 }
00122 sock.disconnectFromHost();
00123 return true;
00124 }
00125