首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Libcurl C++:向单个URL发送请求的非阻塞方式

Libcurl C++:向单个URL发送请求的非阻塞方式
EN

Stack Overflow用户
提问于 2021-06-16 10:24:00
回答 1查看 782关注 0票数 2

目标:将请求发送到同一个URL,而不必等待请求发送函数完成执行。

目前,当我向URL发送请求时,我必须等待10 ms左右服务器的响应,然后使用相同的函数发送另一个请求。其目的是检测网页上的变化比程序当前所做的稍快,所以WHILE循环要以非阻塞的方式运行。

问题:使用libcurl C++,如果我有一个WHILE循环调用一个函数来向URL发送请求,那么在将另一个请求发送到相同的URL之前,如何避免等待该函数完成执行

注意:我一直在研究libcurl的multi-interface,但是我很难确定这个接口是否更适合多个URL的并行请求,而不是向相同的URL发送请求,而不必等待函数每次执行完毕。我尝试了以下方法,并研究了这些资源:

使用libcurl requests

  • http://www.godpatterns.com/2011/09/asynchronous-non-blocking-curl-multi.html

多线程C程序的一种尝试

下面是我向一个URL发送请求的尝试,但我必须等待request()函数完成并返回响应代码,然后再发送相同的请求。

代码语言:javascript
复制
#include <vector>
#include <iostream>
#include <curl/curl.h>

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata) {

        std::vector<char> *response = reinterpret_cast<std::vector<char> *>(userdata);
        response->insert(response->end(), ptr, ptr+nmemb);
        return nmemb;
}

long request(CURL *curl, const std::string &url) {

        std::vector<char> response;
        long response_code;

        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        auto res = curl_easy_perform(curl);
     
        // ...
        // Print variable "response"
        // ...

        return response_code;
}

int main() {
        curl_global_init(CURL_GLOBAL_ALL);
        CURL *curl = curl_easy_init();

        while (true) {
                // blocking: request() must complete before executing again
                long response_code = request(curl, "https://example.com");
                // ...
                // Some condition breaks loop
        }

        curl_easy_cleanup(curl);
        curl_global_cleanup();
        return 0;
}

我现在正试图尽可能最好地理解multi-interface文档,但仍然很难完全理解它/确定它是否真正适合我的特定问题。很抱歉,如果这个问题似乎没有提供足够的我自己的研究,但在我的胡言乱语知识的差距,我正在努力填补。

如果有人能建议/解释我可以修改上面的单个libcurl示例,使其以non-blocking的方式运行,我将不胜感激。

编辑:

从libcurl的non-blocking C实现了名为“多轮询”的示例,当我运行下面的程序时,URL的内容是打印出来的,但是由于它只打印一次,尽管使用了WHILE (1)循环,我不知道它是在向URL发送重复的请求(这是目的),还是仅仅是一个请求,并且正在等待其他更改/事件?

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

/* somewhat unix-specific */
#include <sys/time.h>
#include <unistd.h>

/* curl stuff */
#include <curl/curl.h>

int main(void)
{
        CURL *http_handle;
        CURLM *multi_handle;
        int still_running = 1; /* keep number of running handles */

        curl_global_init(CURL_GLOBAL_DEFAULT);

        http_handle = curl_easy_init();

        curl_easy_setopt(http_handle, CURLOPT_URL, "https://example.com");

        multi_handle = curl_multi_init();

        curl_multi_add_handle(multi_handle, http_handle);

        while (1) {
                CURLMcode mc; /* curl_multi_poll() return code */
                int numfds;

                /* we start some action by calling perform right away */
                mc = curl_multi_perform(multi_handle, &still_running);

                if(still_running) {
                        /* wait for activity, timeout or "nothing" */
                        mc = curl_multi_poll(multi_handle, NULL, 0, 1000, &numfds);
                }

//              if(mc != CURLM_OK) {
//                      fprintf(stderr, "curl_multi_wait() failed, code %d.\n", mc);
//                      break;
//              }
        }

        curl_multi_remove_handle(multi_handle, http_handle);
        curl_easy_cleanup(http_handle);
        curl_multi_cleanup(multi_handle);
        curl_global_cleanup();

        return 0;
}
EN

Stack Overflow用户

发布于 2022-09-02 10:06:33

您需要在while循环中移动curl_multi_add_handle和curl_multi_remove_handle。下面是curl文档https://curl.se/libcurl/c/libcurl-multi.html的摘录

在完成单个传输时,仍会将轻松句柄添加到>多个堆栈中。您需要首先用curl_multi_remove_handle >移除轻松句柄,然后用curl_easy_cleanup关闭它,或者可能为它设置新的选项,然后再用curl_multi_add_handle添加>它来启动另一个传输。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68000859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档