1. 程式人生 > >libcurl庫的http部分介紹

libcurl庫的http部分介紹

複製程式碼複製程式碼
//採用CURLOPT_RESUME_FROM_LARGE 實現檔案斷點續傳功能
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
 
#include <curl/curl.h>
//這個函式為CURLOPT_HEADERFUNCTION引數構造
/* 從http頭部獲取檔案size*/
size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) {
       int r;
       long len = 0;
 
       /* _snscanf() is Win32 specific */
       // r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len);
 r = sscanf(ptr, "Content-Length: %ld\n", &len);
       if (r) /* Microsoft: we don't read the specs */
              *((long *) stream) = len;
 
       return size * nmemb;
}
 
/* 儲存下載檔案 */
size_t wirtefunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
        return fwrite(ptr, size, nmemb, stream);
}
 
/*讀取上傳檔案 */
size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
{
       FILE *f = stream;
       size_t n;
 
       if (ferror(f))
              return CURL_READFUNC_ABORT;
 
       n = fread(ptr, size, nmemb, f) * size;
 
       return n;
}
 
// 下載 或者上傳檔案函式
int download(CURL *curlhandle, const char * remotepath, const char * localpath,
           long timeout, long tries)
{
       FILE *f;
       curl_off_t local_file_len = -1 ;
       long filesize =0 ;
       
       CURLcode r = CURLE_GOT_NOTHING;
       int c;
  struct stat file_info;
  int use_resume = 0;
  /* 得到本地檔案大小 */
  //if(access(localpath,F_OK) ==0)
  
    if(stat(localpath, &file_info) == 0) 
     {
        local_file_len =  file_info.st_size;
        use_resume  = 1;
      }
  //採用追加方式開啟檔案,便於實現檔案斷點續傳工作
       f = fopen(localpath, "ab+"); 
       if (f == NULL) {
              perror(NULL);
              return 0;
       }
 
       //curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
 
       curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
 
              curl_easy_setopt(curlhandle, CURLOPT_CONNECTTIMEOUT, timeout);  // 設定連線超時,單位秒
       //設定http 頭部處理函式
       curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
       curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &filesize);
 // 設定檔案續傳的位置給libcurl
       curl_easy_setopt(curlhandle, CURLOPT_RESUME_FROM_LARGE, use_resume?local_file_len:0);
 
       curl_easy_setopt(curlhandle, CURLOPT_WRITEDATA, f);
       curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, wirtefunc);
 
       //curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
       //curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
       curl_easy_setopt(curlhandle, CURLOPT_NOPROGRESS, 1L);
       curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
  
  
  r = curl_easy_perform(curlhandle);
       
 
       fclose(f);
 
       if (r == CURLE_OK)
              return 1;
       else {
              fprintf(stderr, "%s\n", curl_easy_strerror(r));
              return 0;
       }
}
 
int main(int c, char **argv) {
       CURL *curlhandle = NULL;
 
       curl_global_init(CURL_GLOBAL_ALL);
       curlhandle = curl_easy_init();
 
       //download(curlhandle, "ftp://user:
[email protected]
/path/file", "C:\\file", 0, 3); download(curlhandle , "http://software.sky-union.cn/index.asp","/work/index.asp",1,3); curl_easy_cleanup(curlhandle); curl_global_cleanup(); return 0; }
複製程式碼複製程式碼編譯gcc  resume.c  -o resume –lcurl

相關推薦

libcurlhttp部分介紹

//採用CURLOPT_RESUME_FROM_LARGE 實現檔案斷點續傳功能 #include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #include <curl/curl.h> //這個

LibCurl HTTP部分詳細介紹

//採用CURLOPT_RESUME_FROM_LARGE 實現檔案斷點續傳功能 #include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #include <curl/curl.h> //這個

轉:LibCurl HTTP部分詳細介紹

一、LibCurl基本程式設計框架 二、一些基本的函式 三、curl_easy_setopt函式部分選項介紹 四、curl_easy_perform 函式說明(error 狀態碼) 五、libcurl使用的HTTP訊息頭六、獲取http應答頭資訊 七、多執行緒問題 八、什麼

C/C++使用libcurl發送http請求(get和post可以用於請求html信息,也可以請求xml和json等串)

網絡連接 get 編譯 eas views vs2015 return tar linux C++要實現http網絡連接,需要借助第三方庫,libcurl使用起來還是很方便的 環境:win32 + vs2015 如果要在Linux下使用,基本同理 1,下載

linux下使用libcurl開發http請求客戶端

一、運用開源庫libcurl開發http請求客戶端,實現檔案上傳和字串傳送的功能 /****************************************************** *** Copyright(C) *** author Lu GuoFu *** date 2018-

libcurlhttp get和http post使用【轉】

一、libcurl中的http get使用方法   1. 為什麼要使用libcurl 1) 作為http的客戶端,可以直接用socket連線伺服器,然後對到的資料進行http解析,但要分析協議頭,實現代理…這樣太麻煩了。   2) libcur

C++ 用libcurl進行http 網路通訊程式設計

五、libcurl使用的HTTP訊息頭     當使用libcurl傳送http請求時,它會自動新增一些http頭。我們可以通過CURLOPT_HTTPHEADER屬性手動替換、新增或刪除相應 的HTTP訊息頭。     Host     http1.1(大部分http1.0)版本都要求客戶端請求提供這個

C/C++ 用libcurl進行http通訊網路程式設計

五、libcurl使用的HTTP訊息頭     當使用libcurl傳送http請求時,它會自動新增一些http頭。我們可以通過CURLOPT_HTTPHEADER屬性手動替換、新增或刪除相應 的HTTP訊息頭。     Host     http1.1(大部分http1.0)版本都要求客戶端請求提供這個資

C/C++使用libcurl傳送http請求

C++要實現http網路連線,需要藉助第三方庫,libcurl使用起來還是很方便的 環境:win32 + vs2015 如果要在linux下使用,用cmake編譯,使用基本同理 1,下載編譯libcurl 下載curl原始碼,找到vs工程,按照x86 x64 並對

libcurl的使用支援http、https、ftp(上傳、下載、遠端目錄列表獲取)

這裡是libcurl庫的一個簡單封裝,支援跨平臺。宣告:    本文章可以轉載,但必須註明源部落格地址。共享的demo和curltools類不允許個人上傳網路賺取積分和現金,如有發現必定追究責任,請慎重。直接下載我上傳的資源把curl資料夾解壓到工程程式碼目錄下匯入curlt

c語言libcurl網路http操作程式設計使用

http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目錄索引: 一、LibCurl基本程式設計框架 二、一些基本的函式 三、curl_easy_setopt函式部分選項介紹 四、curl_e

C++用libcurl進行http通訊網路程式設計

//採用CURLOPT_RESUME_FROM_LARGE 實現檔案斷點續傳功能 #include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #include <curl/curl.h> //這個

第二百七十五節,MySQL數據安裝和介紹

關閉 離線 har 內存 query 命令 臨時 rdb 執行文件 MySQL數據庫安裝 一、概述 1、什麽是數據庫 ? 答:數據的倉庫,稱其為數據庫 2、什麽是 MySQL、Oracle、SQLite、Access、MS SQL Server等 ? 答:他們均是一

Neo4J圖的基礎介紹(一)

嵌入 模型 數據模型 特性 所有 並且 int 項目 語言 ?Neo4j是一個高性能的,NOSQL圖形數據庫,它完全支持ACID(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability))數據庫事務屬性,采

node 模塊部分介紹

生成 nod 介紹 super 報告 gen 服務 框架 agent chai 斷言框架 mocha mochawesome 對mocha 定制報告,生成完整成熟的報告。 node-fetch 服務器版fetch superagent 是node 客戶端請求

HTTPHTTP概念介紹

http 協議 術語 工作機制1 概述本文將對HTTP協議的發展,相關術語,工作機制進行介紹2 HTTP協議發展介紹.http/0.9:1991,原型版本,功能簡陋,只有一個命令GETGET /index.html ,服務器只能回應HTML格式字符串,不能回應別的格式.http/1.0: 1996年5月,

memcached數據簡單配置介紹

正常 rep vim local 遠程 system 只需要 get XML 一.memcached數據庫(基於內存的儲存方式;默認端口11211)1.裝包yum -y install memcached telnet (telnet是一款遠程訪問工具,mem軟件無客戶

數據的相關介紹

階段 需要 主鍵約束 圖層 文件 接收 備份 面向 serve 數據庫的相關介紹 文件管理系統的缺點: 編寫應用程序不方便 數據冗余不可避免 應用程序依賴性 不支持對文件的並發訪問 數據間聯系弱 難以按用戶視圖表示數據

Oracle數據基本操作 —— Oracle數據體系結構介紹、DDL、DCL、DML

back 存儲 rop oracle數據 none run 單元 修改表 多列 一、Oracle數據庫介紹 1、基本介紹   Oracle數據庫系統是美國ORACLE公司(甲骨文)提供的以分布式數據庫為核心的一組軟件產品,是目前最流行的客戶/服務器(CLIENT/SERVE

Linux nginx-http配置介紹

Linux nginxnginx工作流程圖 http部分工作流程大致如一個master開啟多個worker,網絡io一般用epoll實現當個worker的高並發,文件io用sendfile,aio等高效移步io,實現一個http請求響應。io部分請參考:http://blog.51cto.com/marvin