libcurl 在 writefunction 回调后继续运行

Posted

技术标签:

【中文标题】libcurl 在 writefunction 回调后继续运行【英文标题】:libcurl continue running after writefunction callback 【发布时间】:2018-01-07 11:26:38 【问题描述】:

我正在尝试将 C 中的 libcurl 库与 pushbullet api 一起使用。我正在尝试连接到https://stream.pushbullet.com/streaming/ 的流。问题是一旦接收到任何数据时调用回调函数,连接就会关闭。我想让它无限期地运行,并让它在每次接收到新数据时调用回调函数。

这是我试过的代码

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

int getwss_cb(char *data) 
    printf("Received data: %s\n", data);


int getwss(void) 
    CURL *easyhandle = curl_easy_init();

    curl_easy_setopt(easyhandle, CURLOPT_URL, "https://stream.pushbullet.com/streaming/<access-token>");
    curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, getwss_cb);
    curl_easy_perform(easyhandle);
    return 0;

基本上我需要 getwss() 函数在运行 getwss_cb() 之后继续运行

【问题讨论】:

无限期是什么意思?你的最终目标是什么? 我需要它继续运行,以便每次流中有新内容时都会调用 getwss_cb。我使用的 url 将以通知的形式发送新数据,每次有这样的通知时我都需要一个函数来运行 您确定此 API 端点是正确的套接字吗?我不知道这个 API,但似乎这个端点只是用于生成一个访问令牌以传递给另一个套接字。 不,我在代码中使用我的个人访问令牌来访问端点。返回的实际数据是一个小的 JSON 字符串,例如 "Type": "nop" @AustinBrunkhorst 我已经编辑了问题以使其更清楚,希望您现在可以理解我的问题 【参考方案1】:

您的回调没有使用正确的原型,也没有返回正确的返回码:

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

在CURLOPT_WRITEFUNCTION 选项的文档中查看解释回调以及它应该返回什么的完整文档。

还要注意,传递给回调的数据不是以零结尾的,所以你不能只打印f-%s它。

【讨论】:

printf 仍然可以正常工作。运行时将消息打印在屏幕上。此外,我真的不需要原型中的尺寸和其他东西,这就是我没有包括它的原因。我还需要拥有它吗?我会尝试使用 size_t 而不是 int 并在可能的时候告诉你结果 printf 可能仍然意外工作,当然 - 但依赖意外行为并不是一个好主意。您应该使用记录在案的正确且准确的原型,否则您将无法获得传入数据的完整大小。 我刚刚做了你建议的更改,但结果是一样的。 size_t getwss_cb(char *data, size_t size1, size_t nmemb1, void *userdata1) printf("Data Recieved!\n"); 对不起,我的错。我尝试使用return 0; 运行,但这也没有任何区别。我不完全确定这是否应该使用正确的行。

以上是关于libcurl 在 writefunction 回调后继续运行的主要内容,如果未能解决你的问题,请参考以下文章

无法启动此程序,因为计算机中丢失libcurl.dll.尝试回重新安装以解决此问题。电脑总出这个啊

curl WRITEFUNCTION 和类

http get请求获取server返回的应答数据

LIBCURL教程

c++多线程中使用libcurl库的问题

libcurl.dll的介绍