我是靠谱客的博主 隐形摩托,最近开发中收集的这篇文章主要介绍一个由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, "%dn", 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, "%dn", ret);
}
...
}

最后

以上就是隐形摩托为你收集整理的一个由uint64_t引起的libcurl中curl_formadd返回CURL_FORMADD_UNKNOWN_OPTION的全部内容,希望文章能够帮你解决一个由uint64_t引起的libcurl中curl_formadd返回CURL_FORMADD_UNKNOWN_OPTION所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部