用 std::streambuf 包装 libcurl 以进行上传
Wrapping libcurl with std::streambuf for uploads?
我已经在libcurl周围实现了std::streambuf
API的读取一半(即underflow()
和xsgetn()
),以便普通istream
可以将这样的streambuf
插入其中并从HTTP或FTP服务器检索内容。效果很好。
现在我想实现 API 的写入一半(即 overflow()
和 xsputn()
),用于将文件上传到 FTP 服务器以执行以下操作:
ostream os( my_curl_streambuf );
curl_easy_setopt( my_curl_handle, CURLOPT_UPLOAD, 1L );
os << is->rdbuf(); // copy entire contents of istream "is" to ostream "os"
问题在于libcurl通过通过CURLOPT_READFUNCTION
设置的读取回调函数使用"拉"API,而上面的最后一行代码是"推送"方式。
这能行得通吗? 即,使用 streambuf
API 包装 libcurl 以进行读取和写入?
我对 libcurl API 的了解不够,但我希望它会提取数据,直到所有数据都用完。由于 IOStreams 有一个推送接口,它不会轻易与拉动接口结合,因此您似乎最好实现一个流,该流缓冲所有输出直到完成,此时对现成的缓冲区进行 libcurl 拉取。您可能sync()
什么都不做,而是提供一个自定义函数,例如,在您的流上send()
,这是将控制权移交给 libcurl 直到它的业务中断的触发器。
另一种方法是使用一个线程来拉取 libcurl,使用另一个线程来写入流,并在 libcurl 拉取数据时将写入的位馈送到流中。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 用 std::streambuf 包装 libcurl 以进行上传
- 为什么我不能将 std::string 与 libcurl 一起使用?