http://blog.csdn.net/zengraoli/article/details/11580525
2013
Libcurl為一個(gè)免費開(kāi)源的,客戶(hù)端curl傳輸庫,FTP,FTPS,TFTP,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE和LDAP,跨平臺,支持Windows,Unix,Linux等,線(xiàn)程安全,支持Ipv6。并且易于使用。
關(guān)于libcurl具體用法:
1、初始化應用程序在使用libcurl之前,必須先初始化libcurl。libcurl只需初始化一次??梢允褂靡韵抡Z(yǔ)句進(jìn)行初始化:
curl_global_init();
2、CURL *curl_easy_init() 此函數需要最先被調用,返回CRUL easy句柄;后續其他函數調用都要用到這個(gè)句柄。如果沒(méi)有調用curl_global_init(),該函數自動(dòng)調用,但是考慮到線(xiàn)程安全的問(wèn)題,最好自己調用curl_global_init()。
3、參數和選項設置都是通過(guò)以下函數完成的,它告訴libcurl怎樣去進(jìn)行傳輸CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter)
參數handle即為curl_easy_init()返回的句柄,后 面根據option的類(lèi)型,設置相應的parameter值,該函數每次調用只能設置一個(gè)選項。
4、curl_easy_perform 函數說(shuō)明(error 狀態(tài)碼).該函數完成curl_easy_setopt指定的所有選項,本節重點(diǎn)介紹curl_easy_perform的返回值。返回0意味一切ok,非0代表錯誤發(fā)生。
通過(guò)以上的了解,實(shí)現文件的上傳功能,即http的put功能。
代碼如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <curl/curl.h>
- #include <curl/types.h>
- #include <curl/easy.h>
-
-
-
- #include <stdarg.h>
- #include <string.h>
- #include <errno.h>
- #include <check_error.h>
-
-
- FILE *fp; //定義FILE類(lèi)型指針
-
- //重寫(xiě)把數據讀入上傳數據流函數
- size_t read_file(void* buff, size_t size, size_t nmemb, void* userp)
- {
- size_t sizes = fread(buff, size, nmemb, (FILE *)userp);
- return sizes;
- }
-
- int main(int argc,char **argv)
- {
- CURLcode res; //easy_handle定義的一些錯誤碼
- const char url[2096];
- //初始化libcurl
-
- if(argc!=3)
- {
- printf("please input url and filename");
- exit(-1);
- }
- res = curl_global_init(CURL_GLOBAL_ALL);
- if (res != CURLE_OK)
- {
- printf("init libcurl failed.\n" );
- return -1;
- }
-
-
- //獲取要上傳的文件指針
- FILE* r_file = fopen(argv[2], "rb");
- if (0 == r_file)
- {
- printf( "the file %s isnot exit\n",argv[2]);
- return -1;
- }
-
- CURL* easy_handle;
-
- easy_handle = curl_easy_init();
- if (0 == easy_handle)
- {
- printf( "get a easy_handle handle fail!");
- fclose(r_file);
- curl_global_cleanup();
- curl_easy_cleanup(easy_handle);
- return -1;
- }
-
- // 獲取文件大小
- fseek(r_file, 0, 2);
- int file_size = ftell(r_file);
- rewind(r_file);
-
- curl_easy_setopt(easy_handle, CURLOPT_URL, argv[1]); //獲取URL地址
- curl_easy_setopt(easy_handle, CURLOPT_UPLOAD, 1); //告訴easy_handle是做上傳操作
- curl_easy_setopt(easy_handle, CURLOPT_READFUNCTION, &read_file); //調用重寫(xiě)的讀文件流函數
- curl_easy_setopt(easy_handle, CURLOPT_READDATA, r_file); //往read_file()函數中傳入用戶(hù)自定義的數據類(lèi)型
- curl_easy_setopt(easy_handle, CURLOPT_INFILE, r_file); //定位作為上傳的輸入文件
- curl_easy_setopt(easy_handle, CURLOPT_VERBOSE, 1); //打印出具體http協(xié)議字段
- //curl_easy_setopt(easy_handle, CURLOPT_HEADER, 1);
- curl_easy_setopt(easy_handle, CURLOPT_INFILESIZE, file_size); //上傳的字節數
-
- //執行設置好的操作
- res = curl_easy_perform(easy_handle);
-
- //獲取HTTP錯誤碼
- int HTTP_flag = 0;
- curl_easy_getinfo(easy_handle, CURLINFO_RESPONSE_CODE , &HTTP_flag);
-
- //一般清理動(dòng)作
- fclose(r_file);
- curl_global_cleanup();
- curl_easy_cleanup(easy_handle);
-
- printf("url :%s localfile: %s\n",argv[1],argv[2]);
- printf("HTTP_flag is %d\n",HTTP_flag);
-
- // printf( "操作本地文件: file_name url:\n");
- //檢測HTTP錯誤碼和執行操作結果
- if (CURLE_OK != res)
- {
- printf("failure\n");
- return -1;
- }
- else
- {
- printf("success\n");
- return 0;
- }
-
- }
轉載自:http://blog.chinaunix.net/uid-27766566-id-3474454.html
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。