我已经在libcurl周围实现了std::streambuf
API的读取一半(即underflow()
和xsgetn()
),以便普通的istream
可以拥有这样的streambuf
1}}插入其中并从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以读取和?
答案 0 :(得分:0)
我对libcurl API知之甚少,但我希望它能够提取数据直到所有数据都耗尽。由于IOStreams有一个push接口,它不会轻易与pull接口结合,所以你最好实现一个缓冲所有输出的流,直到它完成,此时对可用的缓冲区有libcurl pull。你可能sync()
什么也不做,而是在你的流上提供一个自定义函数,比如send()
,这是将控制权交给libcurl的触发器,直到它的业务停止为止。
另一种方法是使用一个线程让libcurl接通,另一个线程写入流并提供写入libcurl的位,当它提取数据时。