如何在Qt5中检查网址是否可用?

时间:2015-02-13 07:31:44

标签: qt network-programming qt5

使用Qt5,如何简单检查给定的网址是否可用?

不使用信号槽的特殊功能,只是使用像bool isUrlAvailable(QString url)之类的东西,有这样的功能吗?

更新 QUrl.isValid()是错误答案,它只是检查url是否正确形成。

更新2 QUrl.host()也是错误的答案,它只是返回给定网址的主机部分,它不检查其可用性。

更新3 ping主机也不正确,因为url可能可用,但不接受icmp echo(= ping)

2 个答案:

答案 0 :(得分:5)

是的,您可以对给定的URL执行HEAD请求。

bool urlExists (QString url_string) {
    QUrl url(url_string);
    QTcpSocket socket;
    socket.connectToHost(url.host(), 80);
    if (socket.waitForConnected()) {
        socket.write("HEAD " + url.path().toUtf8() + " HTTP/1.1\r\n"
                     "Host: " + url.host().toUtf8() + "\r\n\r\n");
        if (socket.waitForReadyRead()) {
            QByteArray bytes = socket.readAll();
            if (bytes.contains("200 OK")) {
                return true;
            }
        }
    }
    return false;
}

这只是200 OK的示例,您可能还想检查状态代码是否是2XX或3XX(重定向)类中的其他代码。

答案 1 :(得分:1)

所以从pajaja +其他一些SO答案+我找到的教程 (http://www.blikoon.com/networking/http-potocol-writting-a-simple-client-using-qt-qtcpsocket-and-troubleshooting-using-telnet

我想出了这个经过调整的版本,因为上面的那个没有工作

bool urlExists(QUrl theurl){
    QTextStream out(stdout);
    QTcpSocket socket;
    QByteArray buffer;

    socket.connectToHost(theurl.host(), 80);
    if (socket.waitForConnected()) {
        //Standard http request
        socket.write("GET / HTTP/1.1\r\n"
                 "host: " + theurl.host().toUtf8() + "\r\n\r\n");
        if (socket.waitForReadyRead()) {
            while(socket.bytesAvailable()){
                buffer.append(socket.readAll());
                int packetSize=buffer.size();
                while(packetSize>0)
                {
                    //Output server response for debugging
                    out << "[" << buffer.data() << "]" <<endl;

                    //set Url if 200, 301, or 302 response given assuming that server will redirect
                    if (buffer.contains("200 OK") ||
                        buffer.contains("302 Found") ||
                        buffer.contains("301 Moved")) {
                        return true;
                    }
                    buffer.remove(0,packetSize);
                    //packetSize=getPacketSize(buffer);
                    packetSize=buffer.size();

                } //while packet size >0
            } //while socket.bytesavail

        } //socket wait for ready read
    }//socket write   
return false;
}

QTextStream打印从套接字中读取的内容,这样您就可以知道要添加的条件以及http请求无法正常工作的原因(我用它来确定我需要301和302)。 while循环是棘轮变形的修改版本

How to read complete data in QTcpSocket?

以确保从套接字中取出所有内容。我正在测试是否需要更改&#34; /index.html"套接字写入的一部分,但到目前为止似乎很好。

编辑:应该是&#34; GET /&#34;不是&#34; GET /index.html"