一个由uint64_t引起的libcurl中curl_formadd返回CURL_FORMADD_UNKNOWN_OPTION

详细描述就是,一个基于libcurl写的程序在电脑上支持正常,在嵌入式系统中运行不正常,报如上错误。我需要进一步追查问题所在。

关键代码如下:

/**
 */
int upload(char* data, uint64_t len, char* name) {
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();

//    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
//    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fd);

    struct curl_httppost *formpost = 0;
    struct curl_httppost *lastptr  = 0;
    int ret = curl_formadd(&formpost, &lastptr,
            CURLFORM_COPYNAME, "file",
            CURLFORM_BUFFER, name,
            CURLFORM_BUFFERPTR, data,
            CURLFORM_BUFFERLENGTH, len,
            CURLFORM_END);
    if(ret != CURLE_OK) {
        fprintf(stderr, "%d\n", ret);
    }
	...
}

查到curl.h中的代码是:

 * CURL_FORMADD_UNKNOWN_OPTION if an unknown option was used

再查,经查curl_formadd是由formdata.c实现的,添加打印寻找原因。最终确定出现CURL_FORMADD_UNKNOWN_OPTION的值始终等于传递进来的len的值。lenvalue而不是option为什么会把一个value当成option呢?我将len转换成uint32_t就没有问题了。这个问题很奇怪,以后还是少用uint64_t。在嵌入式系统中会导致一些奇怪的错误。

/**
 */
int upload(char* data, uint64_t len, char* name) {
    CURL *curl;
    CURLcode res;
    uint32_t len2 = (uint32_t) len;

    curl = curl_easy_init();

//    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
//    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fd);

    struct curl_httppost *formpost = 0;
    struct curl_httppost *lastptr  = 0;
    int ret = curl_formadd(&formpost, &lastptr,
            CURLFORM_COPYNAME, "file",
            CURLFORM_BUFFER, name,
            CURLFORM_BUFFERPTR, data,
            CURLFORM_BUFFERLENGTH, len2,
            CURLFORM_END);
    if(ret != CURLE_OK) {
        fprintf(stderr, "%d\n", ret);
    }
	...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁保康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值