代码之家  ›  专栏  ›  技术社区  ›  Artem Russakovskii

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

  •  3
  • Artem Russakovskii  · 技术社区  · 14 年前

    因为我想放的数据已经在内存中了,所以我真的不想处理文件指针,这似乎是curlu READDATA的默认行为。因此,我知道我需要使用CURLOPT\u READFUNCTION,但我无法理解逻辑。

    以下是相关文件: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTREADFUNCTION

    nmemb=16372 size=1 . 例如,如果我的数据的大小是100K,我需要实现什么逻辑?

    非常感谢。

    2 回复  |  直到 14 年前
        1
  •  10
  •   Matthew Flaschen    14 年前

    你还是想用 CURLOPT_READDATA CURLOPT_READFUNCTION ,它可以是任何用户指定的指针。您可以创建一个简单的结构,如:

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

    哪里 data 是PUT数据和 len 是长度(剩余)。

    curlu读取数据 指向该结构的初始化实例的指针。你会被传过来的 作为 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 复制到\u )将为0。不会复制任何内容,返回0将结束传输。

        2
  •  2
  •   eco    9 年前

    这是正确的方法。

    curl_easy_setopt(curlHandle, CURLOPT_INFILESIZE,(curl_off_t)putData.size);
    

    否则,服务器可能会抛出一个错误,指出未指定请求长度。

    putData是put\ u数据结构的一个实例。