- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须在 c 中使用 FTP 协议(protocol)和 libcurl 传输文件。它工作正常,但我遇到了一些问题。
1) 如果开始传输,但在某个时刻我断开了网络连接,我的程序仍然在 libcurl 函数中,速度变为 0,我无法做任何其他事情。我尝试设置超时(CURLOPT_TIMEOUT),但它只是传输时间的超时。
2) 我遇到的第二个问题与第一个问题相关,我如何知道传输是否成功完成?
我的转移码是:
struct FtpFile {
const char *filename;
FILE *stream;
};
long int size;
static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct FtpFile *out=(struct FtpFile *)stream;
if(out && !out->stream) {
/* open file for writing */
out->stream=fopen(out->filename, "ab");
if(!out->stream)
return -1; /* failure, can't open file to write */
}
return fwrite(buffer, size, nmemb, out->stream);
}
int sz;
int main(void)
{
CURL *curl;
CURLcode res;
char prova;
struct stat statbuf;
FILE *stream;
/* apro il file per leggere la dimensione*/
if ((stream = fopen("Pdf.pdf", "rb"))
== NULL)
{
fprintf(stderr, "Nessun file da aprire, il download partirà da zero.\n");
}
else
{
/* Ricevo informazioni sul file */
fstat(fileno(stream), &statbuf);
fclose(stream);
size = statbuf.st_size;
printf("Dimensione del file in byte: %ld\n", size);
}
struct FtpFile ftpfile={
"Pdf.pdf", /* name to store the file as if succesful */
NULL
};
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "ftp://....");
/* Define our callback to get called when there's data to be written */
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
/* Set a pointer to our struct to pass to the callback */
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);
/* Switch on full protocol/debug output */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
/*Pass a long as parameter. It contains the offset in number of bytes that you want the transfer to start from.
Set this option to 0 to make the transfer start from the beginning (effectively disabling resume). For FTP, set
this option to -1 to make the transfer start from the end of the target file (useful to continue an interrupted
upload).
When doing uploads with FTP, the resume position is where in the local/source file libcurl should try to resume
the upload from and it will then append the source file to the remote target file. */
if(stream == NULL)
{
curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 0);
}
else
{
curl_easy_setopt(curl, CURLOPT_RESUME_FROM, size);
}
/*Used to show file progress*/
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
if(CURLE_OK != res) {
/* we failed */
fprintf(stderr, "curl told us %d\n", res);
}
}
if(ftpfile.stream)
fclose(ftpfile.stream); /* close the local file */
curl_global_cleanup();
return 0;
}
最佳答案
我最近回答了一个 similar question对此。
1) 这是设计使然。如果您想使连接超时,请尝试使用这些:
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, dl_lowspeed_bytes);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, dl_lowspeed_time);
如果您的下载速率低于您想要的阈值,您可以检查连接并采取您认为合适的任何操作。
注意:在 7.25.0 中添加:CURLOPT_TCP_KEEPALIVE, CURLOPT_TCP_KEEPIDLE
所以这些可能是另一个适合您的选择。
2) 像这样:
curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &dl_bytes_remaining);
curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &dl_bytes_received);
if (dl_bytes_remaining == dl_bytes_received)
printf("our work here is done ;)\n");
关于c - libcurl c,超时和成功传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10486119/
我构建了 nss 的 64 位版本,并尝试使用它来使用 --without-ssl 和 --with-nss=NSS_ROOT 选项构建curl 库。 在配置阶段,我看到以下内容: checking
我访问了 4 页。每个页面设置cookies。我如何向 libcurl 询问所有 cookie 或特定 cookie(如“session_id”)的值? 最佳答案 curl_easy_getinfo
我正在使用 libcurl 开发一个 c 程序。 当我构建我的程序时,我可以使用不同版本的 libcurl。 当我从版本更改为其他(libcurl)时,我必须更改源代码中的一些 block 以使其适应
我需要使用“Content-Type: application/json”进行 HTTP DELETE 调用。我如何使用 libcurl 接口(interface)来做到这一点。 最佳答案 我认为在
我通常是一名 Java 开发人员,但我现在正在编写一个 C++ 库,他们将使用 LibCurl。而且我对 C++ 世界一无所知! 我正在写的实际上是供其他开发人员使用的库(它是用于访问我们的 API
我刚刚注意到当我使用 IP 进行 HTTPS 调用时,libcurl 没有设置 SNI 字段。我发现了这个: https://github.com/curl/curl/blame/master/lib
我正在开发 Linux 嵌入式应用程序,它充当客户端并使用 libCurl 从 https 服务器接收数据。我的应用程序的要求是接受过期的证书并继续建立连接。 我找不到任何可以使用 curl_easy
我正在尝试在 OS X 10.11(目标 10.8)上构建启用 SSL 的静态 libcurl.a: export MACOSX_DEPLOYMENT_TARGET="10.8" ./configur
我正在尝试执行rake db:create命令。我收到以下错误 无法打开库'libcurl':libcurl:无法打开共享对象文件:无此类文件或目录。 Could not open library '
我之前问过一个关于 libcurl 的问题。我已经设法自己找到了答案,并且很乐意分享我是如何解决这个问题的,只要我确定它有效。事情是这样的,在此之前,当我尝试编译时链接器会出错,经过一些搜索和反复试验
我已经使用以下配置标志成功地在系统和非 root 用户上安装了 libcurl: ./configure --prefix=/path/to/lib --exec-prefix=/path/to/li
我一直在尝试通过将 libcurl.a 添加到我的 Xcode 7.2 项目来消除对 libcurl.4.dylib 的任何依赖。我构建了一个全新的 libcurl 并将其放在/usr/local/l
我试图在 CentOS6 上安装 R 3.3.2。但不知何故我无法使 libcurl 支持 https。 Here有人建议安装 libcurl:libcurl-devel (rpm) 或 libcur
我试图 curl 到我的本地主机 laravel 站点。我正在使用 XAMPP 7.1 当我尝试重新连接此代码时,总是会出现错误(而不是 200 OK 响应) Fatal error: Uncaugh
在我的开发过程中,我的代码运行正常。当我推送到我的服务器时,它变成了错误。 cURL 错误 6:无法解析主机:http(请参阅 http://curl.haxx.se/libcurl/c/libcur
GuzzleHttp\Exception\RequestException cURL 错误 60:SSL 证书问题:无法获取本地颁发者证书(请参阅 https://curl.haxx.se/libcu
我遇到了这个错误 cURL error 3: malformed (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)将多个模型保存/创建到
如何强制libcurl通过ipv4或ipv6访问以双堆栈模式运行的服务器?使用IP地址应该不难,但是我正在寻找可以与DNS配合使用的东西... 最佳答案 你打赌可以将config CURLOPT_IP
我正在使用 libcurl 从 url 下载文件。文件的原始大小是 1700k,但我只得到 1200k。在我用数据包嗅探器检查后,我意识到数据是以分块编码和 gzip 格式传入的。此外,我的进度回调始
我正在为我的一个项目使用 libcurl。我知道 curl 不用于发出多个并发请求,但 libcurl 是否支持它? 我知道还有其他工具,例如 ab,但 libcurl 提供了很多功能。我再次知道我可
我是一名优秀的程序员,十分优秀!