gpt4 book ai didi

c++ - 如何在不使用文件指针的情况下在 libcurl 中发送长 PUT 数据?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:32 24 4
gpt4 key购买 nike

我正在尝试与 Google Contact API 交互,为了更新远程端的联系人,我需要使用 PUT 请求而不是 POST。

由于我要PUT的数据已经在内存中了,所以我真的不想处理文件指针,这似乎是CURLOPT_READDATA的默认行为。因此,我知道除此之外我还需要使用 CURLOPT_READFUNCTION,但我无法理解其中的逻辑。

这是相关文档:http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTREADFUNCTION

打印传入的变量,我看到 nmemb=16372size=1。例如,如果我的数据大小为 100K,我需要实现的逻辑是什么?

谢谢。

最佳答案

您仍然需要使用 CURLOPT_READDATA,但是如果您使用 CURLOPT_READFUNCTION,它可以是任何用户指定的指针。您可以创建一个简单的结构,例如:

struct put_data
{
char *data;
size_t len;
};

其中 data 是 PUT 数据,len 是长度(剩余)。

然后,将 CURLOPT_READDATA 设置为指向该结构的已初始化实例的指针。您将在 CURLOPT_READFUNCTION 中作为 userdata 传递它。在该函数中,执行如下操作:

size_t curl_size = nmemb * size;
size_t to_copy = (userdata->len < curl_size) ? userdata->len : curl_size;
memcpy(ptr, userdata->data, to_copy);
userdata->len -= to_copy;
userdata->data += to_copy;
return to_copy;

这基本上计算出要复制的数量,复制它,然后更新长度和指针。在 to_copy 行,我们计算最小值,因为我们受剩余数量和 curl 缓冲区大小的限制。最后,我们按照 curl 的要求返回复制的字节数。当您位于内容的末尾时,user_data->len(因此 to_copy)将为 0。不会复制任何内容,返回 0 将结束传输。

关于c++ - 如何在不使用文件指针的情况下在 libcurl 中发送长 PUT 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3562588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com