如何超时libcurl C ++调用和/或知道调用何时发生超时

时间:2011-09-04 18:54:13

标签: c++ timeout libcurl

我正在尝试使用我的C ++程序下载远程html页面,但是有些URL会发生超时,但我不知道如何处理这个问题,因此该程序将无限期挂起。

virtual void downloadpage(string pageaddress) {
    CURL *curl;
        CURLcode informationdownloaded;
        curl = curl_easy_init();
        if (curl) { 
            curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13");
            curl_easy_setopt(curl, CURLOPT_URL, pageaddress.c_str());
            curl_easy_setopt(curl, CURLOPT_HEADER, 0);
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writepageinformation);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &pageinformation);
            informationdownloaded = curl_easy_perform(curl);
            curl_easy_cleanup(curl);
    }
}

这是我通过“writepageinformation”函数将页面的html源代码下载到名为“pageinformation”的字符串变量中的函数。

3 个答案:

答案 0 :(得分:4)

informationdownloaded = curl_easy_perform(curl);

您还可以指定下载超时

curl_easy_setopt(hCurl, CURLOPT_TIMEOUT, iTimeoutSeconds); // timeout for the URL to download

在下载整个文件之前,这是一个阻止的呼叫。 如果您有兴趣中断被阻止的呼叫(对于要杀死的信号),请安装进度回调,如下所示

curl_easy_setopt(hCurl, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(hCurl, CURLOPT_PROGRESSFUNCTION, progress_callback);
curl_easy_setopt(hCurl, CURLOPT_PROGRESSDATA, this);

static int progress_callback(void *clientp,
                           double dltotal,
                           double dlnow,
                           double ultotal,
                           double ulnow)
{
    CLASS &obj = *(CLASS*)clientp;


    if (obj.exit)
      return 1; // if u want the signal curl to unblock and return from curl_easy_perform

    return 0; // if u want the callback to continue
}

答案 1 :(得分:1)

使用CURLOPT_TIMEOUT选项吗?

使用CURLOPT_PROGRESSFUNCTION回调并在您认为足够时停止操作?

使用CURLOPT_LOWSPEED选项或类似选项使其取决于传输速率。

答案 2 :(得分:1)

除了使用public Task createWorker() { return new Task() { @Override protected Object call() throws Exception { list = new LinkedList<BufferedImage>(); list = vX.getFrame(path.getText()); System.out.println(list.size()); vX.getCorruptedImage((LinkedList<BufferedImage>) list); progressInd.progressProperty().unbind(); progressInd.setProgress(task.getProgress()); nextButton.setDisable(false); return output; } }; } 的其他建议,这些建议可以让您定义超时,您应该检查RewriteEngine on #1 Redirect rule to convert _ to - RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(.*?)_+[_-]*(.+?)\sHTTP [NC] RewriteRule ^ /%1-%2 [L,NE,R=302] #2--Redirect "/?load=/foo" to "/foo"--# RewriteCond %{THE_REQUEST} /\?load=/([^\s&]+) [NC] RewriteRule ^ /%1? [NE,L,R=302] #3--Rewrite "/foo" to "/?load=/foo--# RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)/?$ /?load=/$1 [L,QSA] 的返回值,因为它是一个阻止调用。这是libcurl的doc / examples / getinfo.c的略微修改版本,

CURLOPT_TIMEOUT