{"id":643,"date":"2010-11-22T14:01:42","date_gmt":"2010-11-22T06:01:42","guid":{"rendered":"http:\/\/www.awaysoft.com\/taor\/?p=643"},"modified":"2013-12-23T11:12:23","modified_gmt":"2013-12-23T03:12:23","slug":"linux-c-libcurl%e7%9a%84%e7%ae%80%e5%8d%95%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/actom.me\/blog\/linux-c-libcurl%e7%9a%84%e7%ae%80%e5%8d%95%e4%bd%bf%e7%94%a8.html","title":{"rendered":"linux c libcurl\u7684\u7b80\u5355\u4f7f\u7528"},"content":{"rendered":"<p>curl\u662fLinux\u4e0b\u4e00\u4e2a\u975e\u5e38\u8457\u540d\u7684\u4e0b\u8f7d\u5e93\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5e93\uff0c\u53ef\u4ee5\u5f88\u7b80\u5355\u7684\u5b9e\u73b0\u6587\u4ef6\u7684\u4e0b\u8f7d\u7b49\u64cd\u4f5c\u3002<br \/>\n\u770b\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff1a<\/p>\n<pre class=\"lang:c decode:true \">#include &lt;curl\/curl.h&gt;\r\n#include &lt;stdio.h&gt;\r\n#include &lt;string.h&gt;\r\n\r\nCURL *curl;\r\nCURLcode res;\r\n\r\nsize_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)\r\n{\r\nif (strlen((char *)stream) + strlen((char *)ptr) &gt; 999999) return 0;\r\nstrcat(stream, (char *)ptr);\r\nreturn size*nmemb;\r\n}\r\n\r\nchar *down_file(char *filename)\r\n{\r\nstatic char str[10000000];\r\nstrcpy(str, \"\");\r\n\/\/return \"&lt;a href=\\\"http:\/\/gtk.awaysoft.com\/\\\"&gt;\";\r\ncurl_easy_setopt(curl, CURLOPT_URL, filename); \/\/\u8bbe\u7f6e\u4e0b\u8f7d\u5730\u5740\r\ncurl_easy_setopt(curl, CURLOPT_TIMEOUT, 3);\/\/\u8bbe\u7f6e\u8d85\u65f6\u65f6\u95f4\r\ncurl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);\/\/\u8bbe\u7f6e\u5199\u6570\u636e\u7684\u51fd\u6570\r\ncurl_easy_setopt(curl, CURLOPT_WRITEDATA, str);\/\/\u8bbe\u7f6e\u5199\u6570\u636e\u7684\u53d8\u91cf\r\nres = curl_easy_perform(curl);\/\/\u6267\u884c\u4e0b\u8f7d\r\nstr[9999999] = '\\0';\r\nif(CURLE_OK != res) return NULL;\/\/\u5224\u65ad\u662f\u5426\u4e0b\u8f7d\u6210\u529f\r\nreturn str;\r\n}\r\n\r\nint main()\r\n{\r\nchar url[200];\r\ncurl = curl_easy_init();\/\/\u5bf9curl\u8fdb\u884c\u521d\u59cb\u5316\r\nchar *result;\r\nwhile(fgets(url, 200, stdin)){\r\nresult = down_file(url);\r\nif (result) puts(result);\r\nelse puts(\"Get Error!\");\r\nprintf(\"\\nPlease Input a url:\");\r\n\r\n}\r\ncurl_easy_cleanup(curl);\/\/\u91ca\u653ecurl\u8d44\u6e90\r\n\r\nreturn 0;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\u4e0b\u9762\u662f\u8f6c\u8f7d\u7684curl\u8be6\u7ec6\u4f7f\u7528\uff1a<\/p>\n<p><!--more--><\/p>\n<h1><\/h1>\n<div>\n<p>curl-&gt;libcurl\u7684\u624b\u518c\u53ef\u4ee5\u67e5\u770b<\/p>\n<p>http:\/\/curl.haxx.se\/libcurl\/c\/curl_easy_setopt.html#CURLOPTWRITEDATA<\/p>\n<p>\u8bd1\u8005\uff1aJGood(<a href=\"http:\/\/blog.csdn.net\/JGood\">http:\/\/blog.csdn.net\/JGood<\/a> )<\/p>\n<p>\u8bd1\u8005\u6ce8\uff1a\u8fd9\u662f\u4e00\u7bc7\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528libcurl\u7684\u5165\u95e8\u6559\u7a0b\u3002\u6587\u6863\u4e0d\u662f\u9010\u5b57\u9010\u53e5\u6309\u539f\u6587\u7ffb\u8bd1\uff0c\u800c\u662f\u6839\u636e\u7b14\u8005\u5bf9libcurl\u7684\u7406\u89e3\uff0c\u53c2\u8003\u539f\u6587\u5199\u6210\u3002\u6587\u4e2d\u7528\u5230\u7684\u4e00 \u4e9b\u4f8b\u5b50\uff0c\u53ef\u80fd\u4e0d\u662f\u51fa\u81ea\u539f\u6587\uff0c\u800c\u662f\u7b14\u8005\u5728\u5b66\u4e60\u8fc7\u7a0b\u4e2d\uff0c\u5199\u7684\u4e00\u4e9b\u793a\u4f8b\u7a0b\u5e8f\uff08\u7b14\u8005\u4f7f\u7528\u7684libcurl\u7248\u672c\u662f\uff1a7.19.6\uff09\u3002\u51fa\u73b0\u5728\u8fd9\u91cc\u4e3b\u8981\u662f\u4e3a\u4e86\u66f4\u597d\u7684\u8bf4\u660e libcurl\u7684\u67d0\u4e9bapi\u51fd\u6570\u7684\u4f7f\u7528\u3002\u8bb8\u591a\u4f8b\u5b50\u90fd\u53c2\u8003libcurl\u63d0\u4f9b\u7684example\u4ee3\u7801\u3002\u539f\u6587example\u4e2d\u7684\u63d0\u4f9b\u7684\u793a\u4f8b\u7a0b\u5e8f\u5b8c\u5168\u4f7f\u7528C\u8bed\u8a00\uff0c \u800c\u8fd9\u91cc\u7b14\u8005\u63d0\u4f9b\u7684\u4f8b\u5b50\u4f7f\u7528C++\u8bed\u8a00\u3002\u56e0\u4e3a\u80fd\u529b\u6709\u9650\uff0c\u5bf9\u4e8elibcurl\u7684\u67d0\u4e9b\u7406\u89e3\u548c\u4f7f\u7528\u53ef\u80fd\u6709\u8bef\uff0c\u6b22\u8fce\u6279\u8bc4\u6307\u6b63\u3002<\/p>\n<h3>\u76ee\u6807<\/h3>\n<p>\u672c\u6587\u6863\u4ecb\u7ecd\u4e86\u5728\u5e94\u7528\u7a0b\u5e8f\u5f00\u53d1\u8fc7\u7a0b\u4e2d\uff0c\u5982\u4f55\u6b63\u786e\u4f7f\u7528libcurl\u7684\u57fa\u672c\u65b9\u5f0f\u548c\u6307\u5bfc\u539f\u5219\u3002\u6587\u6863\u4f7f\u7528C\u8bed\u8a00\u6765\u8c03\u7528libcurl\u7684\u63a5\u53e3\uff0c\u5f53\u7136\u4e5f\u9002\u7528\u4e8e\u5176\u4ed6\u4e0eC\u8bed\u8a00\u63a5\u8fd1\u7684\u8bed\u8a00\u3002<\/p>\n<p>\u6587\u6863\u4e3b\u8981\u9488\u5bf9\u4f7f\u7528libcurl\u6765\u8fdb\u884c\u5f00\u53d1\u7684\u4eba\u5458\u3002\u6587\u6863\u6240\u63bc\u7684\u5e94\u7528\u7a0b\u5e8f\u6cdb\u6307\u4f60\u5199\u7684\u6e90\u4ee3\u7801\uff0c\u8fd9\u4e9b\u4ee3\u7801\u4f7f\u7528\u4e86libcurl\u8fdb\u884c\u6570\u636e\u4f20\u8f93\u3002<\/p>\n<p>\u66f4\u591a\u5173\u4e8elibcurl\u7684\u529f\u80fd\u548c\u63a5\u53e3\u4fe1\u606f\uff0c\u53ef\u4ee5\u5728\u76f8\u5173\u7684\u4e3b\u9875\u4e0a\u67e5\u9605\u3002<\/p>\n<h3>\u7f16\u8bd1\u6e90\u7801<\/h3>\n<p>\u6709\u5f88\u591a\u79cd\u4e0d\u540c\u7684\u65b9\u5f0f\u6765\u7f16\u8bd1C\u8bed\u8a00\u4ee3\u7801\u3002\u8fd9\u91cc\u4f7f\u7528UNIX\u5e73\u53f0\u4e0b\u7684\u7f16\u8bd1\u65b9\u5f0f\u3002\u5373\u4f7f\u4f60\u4f7f\u7528\u7684\u662f\u5176\u4ed6\u7684\u64cd\u4f5c\u7cfb\u7edf\uff0c\u4f60\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u9605\u8bfb\u672c\u6587\u6863\u6765\u83b7\u53d6\u8bb8\u591a\u6709\u7528\u7684\u4fe1\u606f\u3002<\/p>\n<h5>\u7f16\u8bd1<\/h5>\n<p>\u4f60\u7684\u7f16\u8bd1\u5668\u5fc5\u987b\u77e5\u9053libcurl\u5934\u6587\u4ef6\u7684\u4f4d\u7f6e\u3002\u6240\u4ee5\u5728\u7f16\u8bd1\u7684\u65f6\u5019\uff0c\u4f60\u8981\u8bbe\u7f6e\u5934\u6587\u4ef6\u7684\u5305\u542b\u8def\u5f84\u3002\u53ef\u4ee5\u4f7f\u7528curl-config\u5de5\u5177\u6765\u83b7\u53d6\u8fd9\u65b9\u9762\u7684\u4fe1\u606f\uff1a<\/p>\n<p>$ curl-config \u2013cflags<\/p>\n<h5>\u94fe\u63a5<\/h5>\n<p>\u7f16\u8bd1\u5b8c\u6e90\u7801\uff08\u8fd9\u65f6\u7684\u6e90\u4ee3\u7801\u4e0d\u662f\u6307libcurl\u7684\u6e90\u4ee3\u7801\uff0c\u4f60\u662f\u4f60\u81ea\u5df1\u5199\u7684\u7a0b\u5e8f\u4ee3\u7801\uff09\u4e4b\u540e\uff0c\u4f60\u8fd8\u5fc5\u987b\u628a\u76ee\u6807\u6587\u4ef6\u94fe\u63a5\u6210\u5355\u4e2a\u53ef\u6267\u884c\u6587\u4ef6\u3002\u4f60\u8981\u94fe\u63a5 libcurl\u5e93\uff0c\u4ee5\u53calibcurl\u6240\u4f9d\u8d56\u7684\u5176\u4ed6\u5e93\uff0c\u4f8b\u5982OpenSLL\u5e93\u3002\u5f53\u7136\u53ef\u80fd\u8fd8\u9700\u8981\u4e00\u4e9b\u5176\u4ed6\u7684\u64cd\u4f5c\u7cfb\u7edf\u5e93\u3002\u6700\u540e\u4f60\u8fd8\u8981\u8bbe\u7f6e\u4e00\u4e9b\u7f16\u8bd1\u9009\u9879\uff0c\u5f53\u7136\u53ef \u4ee5\u4f7f\u7528curl-config\u5de5\u5177\u7b80\u5316\u64cd\u4f5c\uff1a<\/p>\n<p>$curl-config \u2013libs<\/p>\n<h5>\u662f\u5426\u4f7f\u7528SSL<\/h5>\n<p>\u5b9a\u5236\u7f16\u8bd1libcurl\u3002\u4e0e\u5176\u4ed6\u5e93\u4e0d\u540c\u7684\u662f\uff0clibcurl\u53ef\u4ee5\u5b9a\u5236\u7f16\u8bd1\uff0c\u6839\u636e\u5b9e\u9645\u9700\u8981\u662f\u5426\u652f\u6301\u67d0\u4e9b\u7279\u6027\uff0c\u5982\u662f\u5426\u652f\u6301SSL\u4f20\u8f93\uff0c\u50cfHTTPS\u548c FTPS\u3002\u5982\u679c\u51b3\u5b9a\u9700\u8981\u652f\u6301SSL\uff0c\u5fc5\u987b\u5728\u7f16\u8bd1\u65f6\u6b63\u786e\u7684\u8bbe\u7f6e\u3002\u53ef\u4ee5\u4f7f\u7528\u2019curl-config\u2019\u6765\u5224\u65adlibcurl\u5e93\u662f\u5426\u652f\u6301SSL\uff1a<\/p>\n<p>$ curl-config \u2013feature<\/p>\n<h5>autoconf\u5b8f<\/h5>\n<p>\u5f53\u4f60\u7f16\u5199\u914d\u7f6e\u811a\u672c\u6765\u68c0\u6d4blibcurl\u53ca\u5176\u76f8\u5e94\u8bbe\u7f6e\u65f6\uff0c\u4f60\u53ef\u4ee5\u4f7f\u7528\u9884\u5b9a\u4e49\u5b8f\u3002\u6587\u6863docs\/libcurl\/libcurl.m4\u544a\u8bc9\u4f60\u5982\u4f55\u4f7f\u7528\u8fd9\u4e9b\u5b8f\u3002<\/p>\n<h3>\u8de8\u5e73\u53f0\u7684\u53ef\u79fb\u690d\u7684\u4ee3\u7801<\/h3>\n<p>libcurl\u7684\u5f00\u53d1\u4eba\u5458\u82b1\u8d39\u5f88\u5927\u7684\u52aa\u529b\uff0c\u4f7flibcurl\u5c3d\u53ef\u80fd\u5728\u5927\u591a\u6570\u5e73\u53f0\u4e0a\u6b63\u5e38\u8fd0\u884c\u3002<\/p>\n<h3>\u5168\u5c40\u521d\u59cb\u5316<\/h3>\n<p>\u5e94\u7528\u7a0b\u5e8f\u5728\u4f7f\u7528libcurl\u4e4b\u524d\uff0c\u5fc5\u987b\u5148\u521d\u59cb\u5316libcurl\u3002libcurl\u53ea\u9700\u521d\u59cb\u5316\u4e00\u6b21\u3002\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u8bed\u53e5\u8fdb\u884c\u521d\u59cb\u5316\uff1a<\/p>\n<div>\n<pre>curl_global_init();<\/pre>\n<\/div>\n<p>curl_global_init()\u63a5\u6536\u4e00\u4e2a\u53c2\u6570\uff0c\u544a\u8bc9libcurl\u5982\u4f55\u521d\u59cb\u5316\u3002\u53c2\u6570<em>CURL_GLOBAL_ALL<\/em> \u4f1a\u4f7flibcurl\u521d\u59cb\u5316\u6240\u6709\u7684\u5b50\u6a21\u5757\u548c\u4e00\u4e9b\u9ed8\u8ba4\u7684\u9009\u9879\uff0c\u901a\u5e38\u8fd9\u662f\u4e00\u4e2a\u6bd4\u8f83\u597d\u7684\u9ed8\u8ba4\u53c2\u6570\u503c\u3002\u8fd8\u6709\u4e24\u4e2a\u53ef\u9009\u503c\uff1a<\/p>\n<h5>CURL_GLOBAL_WIN32<\/h5>\n<p>\u53ea\u80fd\u5e94\u7528\u4e8eWindows\u5e73\u53f0\u3002\u5b83\u544a\u8bc9libcurl\u521d\u59cb\u5316winsock\u5e93\u3002\u5982\u679cwinsock\u5e93\u6ca1\u6709\u6b63\u786e\u5730\u521d\u59cb\u5316\uff0c\u5e94\u7528\u7a0b\u5e8f\u5c31\u4e0d\u80fd\u4f7f\u7528socket\u3002\u5728\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u53ea\u8981\u521d\u59cb\u5316\u4e00\u6b21\u5373\u53ef\u3002<\/p>\n<h5>CURL_GLOBAL_SSL<\/h5>\n<p>\u5982\u679clibcurl\u5728\u7f16\u8bd1\u65f6\u88ab\u8bbe\u5b9a\u652f\u6301SSL\uff0c\u90a3\u4e48\u8be5\u53c2\u6570\u7528\u4e8e\u521d\u59cb\u5316\u76f8\u5e94\u7684SSL\u5e93\u3002\u540c\u6837\uff0c\u5728\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u53ea\u8981\u521d\u59cb\u5316\u4e00\u6b21\u5373\u53ef\u3002<\/p>\n<p>libcurl\u6709\u9ed8\u8ba4\u7684\u4fdd\u62a4\u673a\u5236\uff0c\u5982\u679c\u5728\u8c03\u7528curl_easy_perform\u65f6\u5b83\u68c0\u6d4b\u5230\u8fd8\u6ca1\u6709\u901a\u8fc7curl_global_init\u8fdb\u884c\u521d\u59cb \u5316\uff0clibcurl\u4f1a\u6839\u636e\u5f53\u524d\u7684\u8fd0\u884c\u65f6\u73af\u5883\uff0c\u81ea\u52a8\u8c03\u7528\u5168\u5c40\u521d\u59cb\u5316\u51fd\u6570\u3002\u4f46\u5fc5\u987b\u6e05\u695a\u7684\u662f\uff0c\u8ba9\u7cfb\u7edf\u81ea\u5df2\u521d\u59cb\u5316\u4e0d\u662f\u4e00\u4e2a\u597d\u7684\u9009\u62e9\u3002<\/p>\n<p>\u5f53\u5e94\u7528\u7a0b\u5e8f\u4e0d\u518d\u4f7f\u7528libcurl\u7684\u65f6\u5019\uff0c\u5e94\u8be5\u8c03\u7528curl_global_cleanup\u6765\u91ca\u653e\u76f8\u5173\u7684\u8d44\u6e90\u3002<\/p>\n<p>\u5728\u7a0b\u5e8f\u4e2d\uff0c\u5e94\u5f53\u907f\u514d\u591a\u6b21\u8c03\u7528curl_global_init\u548ccurl_global_cleanup\u3002\u5b83\u4eec\u53ea\u80fd\u88ab\u8c03\u7528\u4e00\u6b21\u3002<\/p>\n<h3>libcurl\u63d0\u4f9b\u7684\u529f\u80fd<\/h3>\n<p>\u5728\u8fd0\u884c\u65f6\u6839\u636elibcurl\u652f\u6301\u7684\u7279\u6027\u6765\u8fdb\u884c\u5f00\u53d1\uff0c\u901a\u5e38\u6bd4\u7f16\u8bd1\u65f6\u66f4\u597d\u3002\u53ef\u4ee5\u901a\u8fc7\u8c03\u7528curl_version_info\u51fd\u6570\u8fd4\u56de\u7684\u7ed3\u6784\u4f53\u6765\u83b7\u53d6\u8fd0\u884c\u65f6\u7684\u5177 \u4f53\u4fe1\u606f\uff0c\u4ece\u800c\u786e\u5b9a\u5f53\u524d\u73af\u5883\u4e0blibcurl\u652f\u6301\u7684\u4e00\u4e9b\u7279\u6027\u3002\u4e0b\u9762\u662f\u7b14\u8005\u5728visual studio2008\u4e2d\u8c03\u7528\u76f8\u5173\u51fd\u6570\u83b7\u53d6libcurl\u7248\u672c\u4fe1\u606f\u7684\u622a\u56fe\uff1a<br \/>\n<a href=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_1.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"pic1\" alt=\"pic1\" src=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_thumb_1.jpg\" width=\"678\" height=\"558\" border=\"0\" \/> <\/a><\/p>\n<h3>\u4f7f\u7528easy interface<\/h3>\n<p>\u9996\u5148\u4ecb\u7ecdlibcurl\u4e2d\u88ab\u79f0\u4e3aeasy interface\u7684api\u51fd\u6570\uff0c\u6240\u6709\u8fd9\u4e9b\u51fd\u6570\u90fd\u662f\u6709\u76f8\u540c\u7684\u524d\u7f00\uff1acurl_easy \u3002<\/p>\n<p>\u5f53\u524d\u7248\u672c\u7684libcurl\u4e5f\u63d0\u4f9b\u4e86multi interface\uff0c\u5173\u4e8e\u8fd9\u4e9b\u63a5\u53e3\u7684\u8be6\u7ec6\u4f7f\u7528\uff0c\u5728\u4e0b\u9762\u7684\u7ae0\u8282\u4e2d\u4f1a\u6709\u4ecb\u7ecd\u3002\u5728\u4f7f\u7528multi interface\u4e4b\u524d\uff0c\u4f60\u9996\u5148\u5e94\u8be5\u7406\u89e3\u5982\u4f55\u4f7f\u7528easy interface\u3002<\/p>\n<p>\u8981\u4f7f\u7528easy interface\uff0c\u9996\u5148\u5fc5\u987b\u521b\u5efa\u4e00\u4e2aeasy handle\uff0ceasy handle\u7528\u4e8e\u6267\u884c\u6bcf\u6b21\u64cd\u4f5c\u3002\u57fa\u672c\u4e0a\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u90fd\u5e94\u8be5\u6709\u81ea\u5df1\u7684easy handle\u7528\u4e8e\u6570\u636e\u901a\u4fe1\uff08\u5982\u679c\u9700\u8981\u7684\u8bdd\uff09\u3002\u5343\u4e07\u4e0d\u8981\u5728\u591a\u7ebf\u7a0b\u4e4b\u95f4\u5171\u4eab\u540c\u4e00\u4e2aeasy handle\u3002\u4e0b\u9762\u7684\u51fd\u6570\u7528\u4e8e\u83b7\u53d6\u4e00\u4e2aeasy handle \uff1a<\/p>\n<p>CURL *easy_handle = curl_easy_init();<\/p>\n<p>\u5728easy handle\u4e0a\u53ef\u4ee5\u8bbe\u7f6e\u5c5e\u6027\u548c\u64cd\u4f5c(action)\u3002easy handle\u5c31\u50cf\u4e00\u4e2a\u903b\u8f91\u8fde\u63a5\uff0c\u7528\u4e8e\u63a5\u4e0b\u6765\u8981\u8fdb\u884c\u7684\u6570\u636e\u4f20\u8f93\u3002<\/p>\n<p>\u4f7f\u7528<a name=\"baidusnap0\"><\/a><strong>curl_easy_setopt<\/strong>\u51fd\u6570\u53ef\u4ee5\u8bbe \u7f6eeasy handle\u7684\u5c5e\u6027\u548c\u64cd\u4f5c\uff0c\u8fd9\u4e9b\u5c5e\u6027\u548c\u64cd\u4f5c\u63a7\u5236libcurl\u5982\u4f55\u4e0e\u8fdc\u7a0b\u4e3b\u673a\u8fdb\u884c\u6570\u636e\u901a\u4fe1\u3002\u4e00\u65e6\u5728easy handle\u4e2d\u8bbe\u7f6e\u4e86\u76f8\u5e94\u7684\u5c5e\u6027\u548c\u64cd\u4f5c\uff0c\u5b83\u4eec\u5c06\u4e00\u76f4\u4f5c\u7528\u8be5easy handle\u3002\u4e5f\u5c31\u662f\u8bf4\uff0c\u91cd\u590d\u4f7f\u7528easy hanle\u5411\u8fdc\u7a0b\u4e3b\u673a\u53d1\u51fa\u8bf7\u6c42\uff0c\u5148\u524d\u8bbe\u7f6e\u7684\u5c5e\u6027\u4ecd\u7136\u751f\u6548\u3002<\/p>\n<p>easy handle\u7684\u8bb8\u591a\u5c5e\u6027\u4f7f\u7528\u5b57\u7b26\u4e32(\u4ee5\\0\u7ed3\u5c3e\u7684\u5b57\u8282\u6570\u7ec4)\u6765\u8bbe\u7f6e\u3002\u901a\u8fc7<strong>curl_easy_setopt<\/strong>\u51fd\u6570\u8bbe\u7f6e\u5b57\u7b26\u4e32\u5c5e\u6027\u65f6\uff0clibcurl\u5185\u90e8\u4f1a\u81ea\u52a8\u62f7\u8d1d\u8fd9\u4e9b\u5b57\u7b26\u4e32\uff0c\u6240\u4ee5\u5728\u8bbe\u7f6e\u5b8c\u76f8\u5173\u5c5e\u6027\u4e4b\u540e\uff0c\u5b57\u7b26\u4e32\u53ef\u4ee5\u76f4\u63a5\u88ab\u91ca\u653e\u6389\uff08\u5982\u679c\u9700\u8981\u7684\u8bdd\uff09\u3002<\/p>\n<p>easy handle\u6700\u57fa\u672c\u3001\u6700\u5e38\u7528\u7684\u5c5e\u6027\u662fURL\u3002\u4f60\u5e94\u5f53\u901a\u8fc7CURLOPT_URL\u5c5e\u6027\u63d0\u4f9b\u9002\u5f53\u7684URL\uff1a<\/p>\n<p><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_URL, &#8220;http:\/\/blog.csdn.net\/JGood &#8220;);<\/p>\n<p>\u5047\u8bbe\u4f60\u8981\u83b7\u53d6URL\u6240\u8868\u793a\u7684\u8fdc\u7a0b\u4e3b\u673a\u4e0a\u7684\u8d44\u6e90\u3002\u4f60\u9700\u8981\u5199\u4e00\u6bb5\u7a0b\u5e8f\u7528\u6765\u5b8c\u6210\u6570\u636e\u4f20\u8f93\uff0c\u4f60\u53ef\u80fd\u5e0c\u671b\u76f4\u63a5\u4fdd\u5b58\u63a5\u6536\u5230\u7684\u6570\u636e\u800c\u4e0d\u662f\u7b80\u5355\u7684\u5728\u8f93\u51fa\u7a97\u53e3\u4e2d\u6253\u5370\u5b83\u4eec\u3002\u6240\u4ee5\uff0c\u4f60\u5fc5\u987b\u9996\u5148\u5199\u4e00\u4e2a\u56de\u8c03\u51fd\u6570\u7528\u6765\u4fdd\u5b58\u63a5\u6536\u5230\u7684\u6570\u636e\u3002\u56de\u8c03\u51fd\u6570\u7684\u539f\u578b\u5982\u4e0b\uff1a<\/p>\n<p>size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);<\/p>\n<p>\u53ef\u4ee5\u4f7f\u7528\u4e0b\u9762\u7684\u8bed\u53e5\u6765\u6ce8\u518c\u56de\u8c03\u51fd\u6570\uff0c\u56de\u8c03\u51fd\u6570\u5c06\u4f1a\u5728\u63a5\u6536\u5230\u6570\u636e\u7684\u65f6\u5019\u88ab\u8c03\u7528\uff1a<\/p>\n<p><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_WRITEFUNCTION, write_data);<\/p>\n<p>\u53ef\u4ee5\u7ed9\u56de\u8c03\u51fd\u6570\u63d0\u4f9b\u4e00\u4e2a\u81ea\u5b9a\u4e49\u53c2\u6570\uff0clibcurl\u4e0d\u5904\u7406\u8be5\u53c2\u6570\uff0c\u53ea\u662f\u7b80\u5355\u7684\u4f20\u9012\uff1a<\/p>\n<p><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_WRITEDATA, &amp;internal_struct);<\/p>\n<p>\u5982\u679c\u4f60\u6ca1\u6709\u901a\u8fc7CURLOPT_WRITEFUNCTION\u5c5e\u6027\u7ed9easy handle\u8bbe\u7f6e\u56de\u8c03\u51fd\u6570\uff0clibcurl\u4f1a\u63d0\u4f9b\u4e00\u4e2a\u9ed8\u8ba4\u7684\u56de\u8c03\u51fd\u6570\uff0c\u5b83\u53ea\u662f\u7b80\u5355\u7684\u5c06\u63a5\u6536\u5230\u7684\u6570\u636e\u6253\u5370\u5230\u6807\u51c6\u8f93\u51fa\u3002\u4f60\u4e5f\u53ef\u4ee5\u901a\u8fc7 CURLOPT_WRITEDATA\u5c5e\u6027\u7ed9\u9ed8\u8ba4\u56de\u8c03\u51fd\u6570\u4f20\u9012\u4e00\u4e2a\u5df2\u7ecf\u6253\u5f00\u7684\u6587\u4ef6\u6307\u9488\uff0c\u7528\u4e8e\u5c06\u6570\u636e\u8f93\u51fa\u5230\u6587\u4ef6\u91cc\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u4e00\u4e9b\u5e73\u53f0\u76f8\u5173\u7684\u6ce8\u610f\u70b9\u3002\u5728\u4e00\u4e9b\u5e73\u53f0\u4e0a\uff0clibcurl\u4e0d\u80fd\u76f4\u63a5\u64cd\u4f5c\u7531\u5e94\u7528\u7a0b\u5e8f\u6253\u5f00\u7684\u6587\u4ef6\u3002\u6240\u4ee5\uff0c\u5982\u679c\u4f7f\u7528\u9ed8\u8ba4\u7684\u56de\u8c03\u51fd\u6570\uff0c\u540c\u65f6\u901a\u8fc7 CURLOPT_WRITEDATA\u5c5e\u6027\u7ed9easy handle\u4f20\u9012\u4e00\u4e2a\u6587\u4ef6\u6307\u9488\uff0c\u5e94\u7528\u7a0b\u5e8f\u53ef\u80fd\u4f1a\u6267\u884c\u5931\u8d25\u3002\u5982\u679c\u4f60\u5e0c\u671b\u81ea\u5df1\u7684\u7a0b\u5e8f\u80fd\u8dd1\u5728\u4efb\u4f55\u7cfb\u7edf\u4e0a\uff0c\u4f60\u5fc5\u987b\u907f\u514d\u51fa\u73b0\u8fd9\u79cd\u60c5\u51b5\u3002<\/p>\n<p>\u5982\u679c\u4ee5win32\u52a8\u6001\u8fde\u63a5\u5e93\u7684\u5f62\u5f0f\u6765\u4f7f\u7528libcurl\uff0c\u5728\u8bbe\u7f6eCURLOPT_WRITEDATA\u5c5e\u6027\u65f6\uff0c\u4f60\u5fc5\u987b<strong>\u540c\u65f6<\/strong> \u4f7f\u7528CURLOPT_WRITEFUNCTION\u6765\u6ce8\u518c\u56de\u8c03\u51fd\u6570\u3002\u5426\u5219\u7a0b\u5e8f\u4f1a\u6267\u884c\u5931\u8d25\uff08\u7b14\u8005\u5c1d\u8bd5\u53ea\u4f20\u9012\u4e00\u4e2a\u6253\u5f00\u7684\u6587\u4ef6\u6307\u9488\u800c\u4e0d\u663e\u5f0f\u8bbe\u7f6e\u56de\u8c03\u51fd\u6570\uff0c\u7a0b\u5e8f\u5e76\u6ca1\u6709\u5d29\u6e83\u3002\u53ef\u80fd\u662f\u6211\u4f7f\u7528\u7684\u65b9\u5f0f\u4e0d\u6b63\u786e\u3002\uff09\u3002<\/p>\n<p>\u5f53\u7136\uff0clibcurl\u8fd8\u652f\u6301\u8bb8\u591a\u5176\u4ed6\u7684\u5c5e\u6027\uff0c\u5728\u63a5\u4e0b\u6765\u7684\u7bc7\u5e45\u91cc\uff0c\u4f60\u5c06\u4f1a\u9010\u6b65\u5730\u63a5\u89e6\u5230\u5b83\u4eec\u3002\u8c03\u7528\u4e0b\u9762\u7684\u51fd\u6570\uff0c\u5c06\u6267\u884c\u771f\u6b63\u7684\u6570\u636e\u901a\u4fe1\uff1a<\/p>\n<p>success = curl_easy_perform(easy_handle);<\/p>\n<p>curl_easy_perfrom\u5c06\u8fde\u63a5\u5230\u8fdc\u7a0b\u4e3b\u673a\uff0c\u6267\u884c\u5fc5\u8981\u7684\u547d\u4ee4\uff0c\u5e76\u63a5\u6536\u6570\u636e\u3002\u5f53\u63a5\u6536\u5230\u6570\u636e\u65f6\uff0c\u5148\u524d\u8bbe\u7f6e\u7684\u56de\u8c03\u51fd\u6570\u5c06\u88ab\u8c03\u7528\u3002libcurl\u53ef\u80fd\u4e00 \u6b21\u53ea\u63a5\u6536\u52301\u5b57\u8282\u7684\u6570\u636e\uff0c\u4e5f\u53ef\u80fd\u63a5\u6536\u5230\u597d\u51e0K\u7684\u6570\u636e\uff0clibcurl\u4f1a\u5c3d\u53ef\u80fd\u591a\u3001\u53ca\u65f6\u7684\u5c06\u6570\u636e\u4f20\u9012\u7ed9\u56de\u8c03\u51fd\u6570\u3002\u56de\u8c03\u51fd\u6570\u8fd4\u56de\u63a5\u6536\u7684\u6570\u636e\u957f\u5ea6\u3002\u5982\u679c\u56de\u8c03\u51fd\u6570 \u8fd4\u56de\u7684\u6570\u636e\u957f\u5ea6\u4e0e\u4f20\u9012\u7ed9\u5b83\u7684\u957f\u5ea6\u4e0d\u4e00\u81f4\uff08\u5373\u8fd4\u56de\u957f\u5ea6 != size * nmemb\uff09\uff0clibcurl\u5c06\u4f1a\u7ec8\u6b62\u64cd\u4f5c\uff0c\u5e76\u8fd4\u56de\u4e00\u4e2a\u9519\u8bef\u4ee3\u7801\u3002<\/p>\n<p>\u5f53\u6570\u636e\u4f20\u9012\u7ed3\u675f\u7684\u65f6\u5019\uff0ccurl_easy_perform\u5c06\u8fd4\u56de\u4e00\u4e2a\u4ee3\u7801\u8868\u793a\u64cd\u4f5c\u6210\u529f\u6216\u5931\u8d25\u3002\u5982\u679c\u9700\u8981\u83b7\u53d6\u66f4\u591a\u6709\u5173\u901a\u4fe1\u7ec6\u8282\u7684\u4fe1\u606f\uff0c\u4f60\u53ef\u4ee5\u8bbe\u7f6eCURLOPT_ERRORBUFFER\u5c5e\u6027\uff0c\u8ba9libcurl\u7f13\u5b58\u8bb8\u591a\u53ef\u8bfb\u7684\u9519\u8bef\u4fe1\u606f\u3002<\/p>\n<p>easy handle\u5728\u5b8c\u6210\u4e00\u6b21\u6570\u636e\u901a\u4fe1\u4e4b\u540e\u53ef\u4ee5\u88ab\u91cd\u7528\u3002\u8fd9\u91cc\u975e\u5e38\u5efa\u8bae\u4f60\u91cd\u7528\u4e00\u4e2a\u5df2\u7ecf\u5b58\u5728\u7684easy handle\u3002\u5982\u679c\u5728\u5b8c\u6210\u6570\u636e\u4f20\u8f93\u4e4b\u540e\uff0c\u4f60\u521b\u5efa\u53e6\u4e00\u4e2aeasy handle\u6765\u6267\u884c\u5176\u4ed6\u7684\u6570\u636e\u901a\u4fe1\uff0clibcurl\u5728\u5185\u90e8\u4f1a\u5c1d\u8bd5\u7740\u91cd\u7528\u4e0a\u4e00\u6b21\u521b\u5efa\u7684\u8fde\u63a5\u3002<\/p>\n<p>\u5bf9\u4e8e\u6709\u4e9b\u534f\u8bae\uff0c\u4e0b\u8f7d\u6587\u4ef6\u53ef\u80fd\u5305\u62ec\u8bb8\u591a\u590d\u6742\u7684\u5b50\u8fc7\u7a0b\uff1a\u65e5\u5fd7\u8bb0\u5f55\u3001\u8bbe\u7f6e\u4f20\u8f93\u6a21\u5f0f\u3001\u9009\u62e9\u5f53\u524d\u6587\u4ef6\u5939\uff0c\u6700\u540e\u4e0b\u8f7d\u6587\u4ef6\u6570\u636e\u3002\u4f7f\u7528libcurl\uff0c\u4f60\u4e0d\u9700\u8981\u5173\u5fc3\u8fd9\u4e00\u5207\uff0c\u4f60\u53ea\u9700\u7b80\u5355\u5730\u63d0\u4f9b\u4e00\u4e2aURL\uff0clibcurl\u4f1a\u7ed9\u4f60\u505a\u5269\u4f59\u6240\u6709\u7684\u5de5\u4f5c\u3002<\/p>\n<p>\u4e0b\u9762\u7684\u8fd9\u4e2a\u4f8b\u5b50\u6f14\u793a\u4e86\u5982\u4f55\u83b7\u53d6\u7f51\u9875\u6e90\u7801\uff0c\u5c06\u5176\u4fdd\u5b58\u5230\u672c\u5730\u6587\u4ef6\uff0c\u5e76\u540c\u65f6\u5c06\u83b7\u53d6\u7684\u6e90\u7801\u8f93\u51fa\u5230\u63a7\u5236\u53f0\u4e0a\u3002<\/p>\n<div>\n<pre>\/**\r\n *\t@brief libcurl\u63a5\u6536\u5230\u6570\u636e\u65f6\u7684\u56de\u8c03\u51fd\u6570\r\n *\r\n *\t\u5c06\u63a5\u6536\u5230\u7684\u6570\u636e\u4fdd\u5b58\u5230\u672c\u5730\u6587\u4ef6\u4e2d\uff0c\u540c\u65f6\u663e\u793a\u5728\u63a7\u5236\u53f0\u4e0a\u3002\r\n *\r\n *\t@param [in] buffer \u63a5\u6536\u5230\u7684\u6570\u636e\u6240\u5728\u7f13\u51b2\u533a\r\n *\t@param [in] size \u6570\u636e\u957f\u5ea6\r\n *\t@param [in] nmemb \u6570\u636e\u7247\u6570\u91cf\r\n *\t@param [in\/out] \u7528\u6237\u81ea\u5b9a\u4e49\u6307\u9488\r\n *\t@return \u83b7\u53d6\u7684\u6570\u636e\u957f\u5ea6\r\n *\/\r\n\r\nsize_t process_data(void *buffer, size_t size, size_t nmemb, void *user_p)\r\n{\r\n\tFILE *fp = (FILE *)user_p;\r\n\tsize_t return_size = fwrite(buffer, size, nmemb, fp);\r\n\tcout &lt;&lt; (char *)buffer &lt;&lt; endl;<\/pre>\n<pre>\treturn return_size;\r\n}\r\n\r\nint main(int argc, char **argv)\r\n{\r\n\t\/\/ \u521d\u59cb\u5316libcurl\r\n\tCURLcode return_code;\r\n\treturn_code = curl_global_init(CURL_GLOBAL_WIN32);\r\n\tif (CURLE_OK != return_code)\r\n\t{\r\n\t\tcerr &lt;&lt; \"init libcurl failed.\" &lt;&lt; endl;\r\n\t\treturn -1;\r\n\t}\r\n\r\n\t\/\/ \u83b7\u53d6easy handle\r\n\tCURL *easy_handle = curl_easy_init();\r\n\tif (NULL == easy_handle)\r\n\t{\r\n\t\tcerr &lt;&lt; \"get a easy handle failed.\" &lt;&lt; endl;\r\n                  curl_global_cleanup();<\/pre>\n<pre>\t\treturn -1;\r\n\t}\r\n\r\n\tFILE *fp = fopen(\"data.html\", \"ab+\");\t\/\/ \r\n\t\/\/ \u8bbe\u7f6eeasy handle\u5c5e\u6027\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_URL, <a href=\"http:\/\/blog.csdn.net\/JGood\">http:\/\/blog.csdn.net\/JGood<\/a>);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_WRITEFUNCTION, &amp;process_data);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_WRITEDATA, fp);\r\n\r\n\t\/\/ \u6267\u884c\u6570\u636e\u8bf7\u6c42\r\n\tcurl_easy_perform(easy_handle);\t\r\n\r\n\t\/\/ \u91ca\u653e\u8d44\u6e90\r\n\r\n\tfclose(fp);\r\n\tcurl_easy_cleanup(easy_handle);\r\n\tcurl_global_cleanup();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<\/div>\n<h3>\u591a\u7ebf\u7a0b\u95ee\u9898<\/h3>\n<p>\u9996\u5148\u4e00\u4e2a\u57fa\u672c\u539f\u5219\u5c31\u662f\uff1a\u7edd\u5bf9\u4e0d\u5e94\u8be5\u5728\u7ebf\u7a0b\u4e4b\u95f4\u5171\u4eab\u540c\u4e00\u4e2alibcurl handle\uff0c\u4e0d\u7ba1\u662feasy handle\u8fd8\u662fmulti handle\uff08\u5c06\u5728\u4e0b\u6587\u4e2d\u4ecb\u7ecd\uff09\u3002\u4e00\u4e2a\u7ebf\u7a0b\u6bcf\u6b21\u53ea\u80fd\u4f7f\u7528\u4e00\u4e2ahandle\u3002<\/p>\n<p>libcurl\u662f\u7ebf\u7a0b\u5b89\u5168\u7684\uff0c\u4f46\u6709\u4e24\u70b9\u4f8b\u5916\uff1a\u4fe1\u53f7(signals)\u548cSSL\/TLS handler\u3002 \u4fe1\u53f7\u7528\u4e8e\u8d85\u65f6\u5931\u6548\u540d\u5b57\u89e3\u6790(timing out name resolves)\u3002libcurl\u4f9d\u8d56\u5176\u4ed6\u7684\u5e93\u6765\u652f\u6301SSL\/STL\uff0c\u6240\u4ee5\u7528\u591a\u7ebf\u7a0b\u7684\u65b9\u5f0f\u8bbf\u95eeHTTPS\u6216FTPS\u7684URL\u65f6\uff0c\u5e94\u8be5\u6ee1\u8db3\u8fd9\u4e9b\u5e93\u5bf9\u591a\u7ebf\u7a0b \u64cd\u4f5c\u7684\u4e00\u4e9b\u8981\u6c42\u3002\u8be6\u7ec6\u53ef\u4ee5\u53c2\u8003\uff1a<\/p>\n<p>OpenSSL: <a href=\"http:\/\/www.openssl.org\/docs\/crypto\/threads.html#DESCRIPTION\">http:\/\/www.openssl.org\/docs\/crypto\/threads.html#DESCRIPTION<\/a><\/p>\n<p>GnuTLS: <a href=\"http:\/\/www.gnu.org\/software\/gnutls\/manual\/html_node\/Multi_002dthreaded-applications.html\">http:\/\/www.gnu.org\/software\/gnutls\/manual\/html_node\/Multi_002dthreaded-applications.html<\/a><\/p>\n<p>NSS: \u5ba3\u79f0\u662f\u591a\u7ebf\u7a0b\u5b89\u5168\u7684\u3002<\/p>\n<h3>\u4ec0\u4e48\u65f6\u5019libcurl\u65e0\u6cd5\u6b63\u5e38\u5de5\u4f5c<\/h3>\n<p>\u4f20\u8f93\u5931\u8d25\u603b\u662f\u6709\u539f\u56e0\u7684\u3002\u4f60\u53ef\u80fd\u9519\u8bef\u7684\u8bbe\u7f6e\u4e86\u4e00\u4e9blibcurl\u7684\u5c5e\u6027\u6216\u8005\u6ca1\u6709\u6b63\u786e\u7684\u7406\u89e3\u67d0\u4e9b\u5c5e\u6027\u7684\u542b\u4e49\uff0c\u6216\u8005\u662f\u8fdc\u7a0b\u4e3b\u673a\u8fd4\u56de\u4e00\u4e9b\u65e0\u6cd5\u88ab\u6b63\u786e\u89e3\u6790\u7684\u5185\u5bb9\u3002<\/p>\n<p>\u8fd9\u91cc\u6709\u4e00\u4e2a\u9ec4\u91d1\u6cd5\u5219\u6765\u5904\u7406\u8fd9\u4e9b\u95ee\u9898\uff1a\u5c06CURLOPT_VERBOSE\u5c5e\u6027\u8bbe\u7f6e\u4e3a1\uff0clibcurl\u4f1a\u8f93\u51fa\u901a\u4fe1\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u7ec6\u8282\u3002\u5982\u679c\u4f7f\u7528\u7684\u662fhttp\u534f\u8bae\uff0c\u8bf7\u6c42\u5934\/\u54cd\u5e94\u5934\u4e5f\u4f1a\u88ab\u8f93\u51fa\u3002\u5c06CURLOPT_HEADER\u8bbe\u4e3a1\uff0c\u8fd9\u4e9b\u5934\u4fe1\u606f\u5c06\u51fa\u73b0\u5728\u6d88\u606f\u7684\u5185\u5bb9\u4e2d\u3002<\/p>\n<p>\u5f53\u7136\u4e0d\u53ef\u5426\u8ba4\u7684\u662f\uff0clibcurl\u8fd8\u5b58\u5728bug\u3002\u5f53\u4f60\u5728\u4f7f\u7528libcurl\u7684\u8fc7\u7a0b\u4e2d\u53d1\u73b0bug\u65f6\uff0c\u5e0c\u671b\u80fd\u591f\u63d0\u4ea4\u7ed9\u6211\u4eec\uff0c\u597d\u8ba9\u6211\u4eec\u80fd\u591f\u4fee\u590d\u8fd9\u4e9bbug\u3002\u4f60\u5728 \u63d0\u4ea4bug\u65f6\uff0c\u8bf7\u540c\u65f6\u63d0\u4f9b\u8be6\u7ec6\u7684\u4fe1\u606f\uff1a\u901a\u8fc7CURLOPT_VERBOSE\u5c5e\u6027\u8ddf\u8e2a\u5230\u7684\u534f\u8bae\u4fe1\u606f\u3001libcurl\u7248\u672c\u3001libcurl\u7684\u5ba2\u6237\u4ee3\u7801\u3001\u64cd\u4f5c\u7cfb \u7edf\u540d\u79f0\u3001\u7248\u672c\u3001\u7f16\u8bd1\u5668\u540d\u79f0\u3001\u7248\u672c\u7b49\u7b49\u3002<\/p>\n<p>\u5982\u679c\u4f60\u5bf9\u76f8\u5173\u7684\u534f\u8bae\u4e86\u89e3\u8d8a\u591a\uff0c\u5728\u4f7f\u7528libcurl\u65f6\uff0c\u5c31\u8d8a\u4e0d\u5bb9\u6613\u72af\u9519\u3002<\/p>\n<h3>\u4e0a\u4f20\u6570\u636e\u5230\u8fdc\u7a0b\u7ad9\u70b9<\/h3>\n<p>libcurl\u63d0\u4f9b\u534f\u8bae\u65e0\u5173\u7684\u65b9\u5f0f\u8fdb\u884c\u6570\u636e\u4f20\u8f93\u3002\u6240\u4ee5\u4e0a\u4f20\u4e00\u4e2a\u6587\u4ef6\u5230FTP\u670d\u52a1\u5668\uff0c\u8ddf\u5411HTTP\u670d\u52a1\u5668\u63d0\u4ea4\u4e00\u4e2aPUT\u8bf7\u6c42\u7684\u64cd\u4f5c\u65b9\u5f0f\u662f\u7c7b\u4f3c\u7684\uff1a<\/p>\n<p>1. \u521b\u5efaeasy handle\u6216\u8005\u91cd\u7528\u5148\u524d\u521b\u5efa\u7684easy handle\u3002<\/p>\n<p>2. \u8bbe\u7f6eCURLOPT_URL\u5c5e\u6027\u3002<\/p>\n<p>3. \u7f16\u5199\u56de\u8c03\u51fd\u6570\u3002\u5728\u6267\u884c\u4e0a\u4f20\u7684\u65f6\u5019\uff0clibcurl\u901a\u8fc7\u56de\u8c03\u51fd\u6570\u8bfb\u53d6\u8981\u4e0a\u4f20\u7684\u6570\u636e\u3002\uff08\u5982\u679c\u8981\u4ece\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0b\u8f7d\u6570\u636e\uff0c\u53ef\u4ee5\u901a\u8fc7\u56de\u8c03\u6765\u4fdd\u5b58\u63a5\u6536\u5230\u7684\u6570\u636e\u3002\uff09\u56de\u8c03\u51fd\u6570\u7684\u539f\u578b\u5982\u4e0b\uff1a<\/p>\n<div>\n<pre>size_t function(char *bufptr, size_t size, size_t nitems, void *userp);<\/pre>\n<\/div>\n<p>bufptr\u6307\u9488\u8868\u793a\u7f13\u51b2\u533a\uff0c\u7528\u4e8e\u4fdd\u5b58\u8981\u4e0a\u4f20\u7684\u6570\u636e\uff0csize * nitems\u662f\u7f13\u51b2\u533a\u6570\u636e\u7684\u957f\u5ea6\uff0cuserp\u662f\u4e00\u4e2a\u7528\u6237\u81ea\u5b9a\u4e49\u6307\u9488\uff0clibcurl\u4e0d\u5bf9\u8be5\u6307\u9488\u4f5c\u4efb\u4f55\u64cd\u4f5c\uff0c\u5b83\u53ea\u662f\u7b80\u5355\u7684\u4f20\u9012\u8be5\u6307\u9488\u3002\u53ef\u4ee5\u4f7f\u7528\u8be5\u6307\u9488\u5728\u5e94\u7528\u7a0b\u5e8f\u4e0elibcurl\u4e4b\u95f4\u4f20\u9012\u4fe1\u606f\u3002<\/p>\n<p>4. \u6ce8\u518c\u56de\u8c03\u51fd\u6570\uff0c\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u6307\u9488\u3002\u8bed\u6cd5\u5982\u4e0b\uff1a<\/p>\n<div>\n<pre>\/\/ \u6ce8\u518c\u56de\u8c03\u51fd\u6570\r\n<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_READFUNCTION, read_function); \r\n\/\/ \u8bbe\u7f6e\u81ea\u5b9a\u4e49\u6307\u9488\r\n<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_READDATA, &amp;filedata);<\/pre>\n<\/div>\n<p>5. \u544a\u8bc9libcurl\uff0c\u6267\u884c\u7684\u662f\u4e0a\u4f20\u64cd\u4f5c\u3002<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_UPLOAD, 1L);<\/pre>\n<\/div>\n<p>\u6709\u4e9b\u534f\u8bae\u5728\u6ca1\u6709\u9884\u5148\u77e5\u9053\u4e0a\u4f20\u6587\u4ef6\u5927\u5c0f\u7684\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u65e0\u6cd5\u6b63\u786e\u5224\u65ad\u4e0a\u4f20\u662f\u5426\u7ed3\u675f\uff0c\u6240\u4ee5\u6700\u597d\u9884\u5148\u4f7f\u7528CURLOPT_INFILESIZE_LARGE\u5c5e\u6027\uff1a\u544a\u8bc9\u5b83\u8981\u4e0a\u4f20\u6587\u4ef6\u7684\u5927\u5c0f\uff1a<\/p>\n<div>\n<pre>\/* in this example, file_size must be an curl_off_t variable *\/\r\n<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_INFILESIZE_LARGE, file_size);<\/pre>\n<\/div>\n<p>6. \u8c03\u7528curl_easy_perform\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0clibcurl\u5c06\u4f1a\u5b8c\u6210\u5269\u4e0b\u7684\u6240\u6709\u5de5\u4f5c\u3002\u5728\u4e0a\u4f20\u6587\u4ef6\u8fc7\u7a0b\u4e2d\uff0clibcurl\u4f1a\u4e0d\u65ad\u8c03\u7528\u5148\u524d\u8bbe\u7f6e\u7684\u56de\u8c03\u51fd\u6570\uff0c\u7528\u4e8e\u5c06\u8981\u4e0a\u4f20\u7684\u6570\u636e\u8bfb\u5165\u5230\u7f13\u51b2\u533a\uff0c\u5e76\u6267\u884c\u4e0a\u4f20\u3002<\/p>\n<p>\u4e0b\u9762\u7684\u4f8b\u5b50\u6f14\u793a\u5982\u4f55\u5c06\u6587\u4ef6\u4e0a\u4f20\u5230FTP\u670d\u52a1\u5668\u3002\u7b14\u8005\u4f7f\u7528\u7684\u662fIIS\u81ea\u5e26\u7684FTP\u670d\u52a1\uff0c\u540c\u65f6\u5728FTP\u4e0a\u8bbe\u7f6e\u4e86\u53ef\u5199\u6743\u9650\u3002<\/p>\n<div>\n<pre>\/**\r\n *\t@brief \u8bfb\u53d6\u6570\u636e\u7684\u56de\u8c03\u3002\r\n *\/\r\nsize_t read_data(void *buffer, size_t size, size_t nmemb, void *user_p)\r\n{\r\n\treturn fread(buffer, size, nmemb, (FILE *)user_p);\r\n}\r\n\r\nint main(int argc, char **argv)\r\n{\r\n\t\/\/ \u521d\u59cb\u5316libcurl\r\n\tCURLcode code;\r\n\tcode = curl_global_init(CURL_GLOBAL_WIN32);\r\n\tif (code != CURLE_OK)\r\n\t{\r\n\t\tcerr &lt;&lt; \"init libcurl failed.\" &lt;&lt; endl;\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tFILE *fp = fopen(\"a.html\", \"rb\");\r\n\tif (NULL == fp)\r\n\t{\r\n\t\tcout &lt;&lt; \"can't open file.\" &lt;&lt; endl;\r\n\t\tcurl_global_cleanup();\r\n\t\treturn -1;\r\n\t}\r\n\r\n\t\/\/ \u83b7\u53d6\u6587\u4ef6\u5927\u5c0f\r\n\tfseek(fp, 0, 2);\r\n\tint file_size = ftell(fp);\r\n\trewind(fp);\r\n\r\n\t\/\/ \u83b7\u53d6easy handle\r\n\r\n\tCURL *easy_handle = NULL;\r\n\teasy_handle = curl_easy_init();\r\n\tif (NULL == easy_handle)\r\n\t{\r\n\t\tcerr &lt;&lt; \"get a easy handle failed.\" &lt;&lt; endl;\r\n\t\tfclose(fp);\r\n\t\tcurl_global_cleanup();\r\n\t\treturn -1;\r\n\t}\r\n\r\n\t\/\/ \u8bbe\u7f6eeash handle\u5c5e\u6027\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_URL, <a href=\"ftp:\/\/127.0.0.1\/upload.html%29;curl_easy_setopt%28easy_handle\">ftp:\/\/127.0.0.1\/upload.html<\/a><a href=\"ftp:\/\/127.0.0.1\/upload.html%29;curl_easy_setopt%28easy_handle\">);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle<\/a>, CURLOPT_UPLOAD, 1L);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_READFUNCTION, &amp;read_data);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_READDATA, fp);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_INFILESIZE_LARGE, file_size);\r\n\r\n\t\/\/ \u6267\u884c\u4e0a\u4f20\u64cd\u4f5c\r\n\tcode = curl_easy_perform(easy_handle);\r\n\tif (code == CURLE_OK)\r\n\t{\r\n\t\tcout &lt;&lt; \"upload successfully.\" &lt;&lt; endl;\r\n\t}\r\n\r\n\t\/\/ \u91ca\u653e\u8d44\u6e90\r\n\tfclose(fp);\r\n\tcurl_easy_cleanup(easy_handle);\r\n\tcurl_global_cleanup();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<\/div>\n<h3>\u5173\u4e8e\u5bc6\u7801<\/h3>\n<p>\u5ba2\u6237\u7aef\u5411\u670d\u52a1\u5668\u53d1\u9001\u8bf7\u6c42\u65f6\uff0c\u8bb8\u591a\u534f\u8bae\u90fd\u8981\u6c42\u63d0\u4f9b\u7528\u6237\u540d\u4e0e\u5bc6\u7801\u3002libcurl\u63d0\u4f9b\u4e86\u591a\u79cd\u65b9\u5f0f\u6765\u8bbe\u7f6e\u5b83\u4eec\u3002<\/p>\n<p>\u4e00\u4e9b\u534f\u8bae\u652f\u6301\u5728URL\u4e2d\u76f4\u63a5\u6307\u5b9a\u7528\u6237\u540d\u548c\u5bc6\u7801\uff0c\u7c7b\u4f3c\u4e8e\uff1a protocol:\/\/user:password@example.com\/path\/\u3002libcurl\u80fd\u6b63\u786e\u7684\u8bc6\u522b\u8fd9\u79cdURL\u4e2d\u7684\u7528\u6237\u540d\u4e0e\u5bc6\u7801\u5e76\u6267\u884c \u76f8\u5e94\u7684\u64cd\u4f5c\u3002\u5982\u679c\u4f60\u63d0\u4f9b\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\u4e2d\u6709\u7279\u6b8a\u5b57\u7b26\uff0c\u9996\u5148\u5e94\u8be5\u5bf9\u5176\u8fdb\u884cURL\u7f16\u7801\u3002<\/p>\n<p>\u4e5f\u53ef\u4ee5\u901a\u8fc7CURLOPT_USERPWD\u5c5e\u6027\u6765\u8bbe\u7f6e\u7528\u6237\u540d\u4e0e\u5bc6\u7801\u3002\u53c2\u6570\u662f\u683c\u5f0f\u5982 \u201cuser:password \u201d\u7684\u5b57\u7b26\u4e32\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_USERPWD, \"user_name:password\");<\/pre>\n<\/div>\n<p>\uff08\u4e0b\u9762\u8fd9\u51e0\u6bb5\u6587\u5b57\u6211\u7406\u89e3\u5730\u6a21\u6a21\u7cca\u7cca\uff09\u6709\u65f6\u5019\u5728\u8bbf\u95ee\u4ee3\u7406\u670d\u52a1\u5668\u7684\u65f6\u5019\uff0c\u53ef\u80fd\u65f6\u65f6\u8981\u6c42\u63d0\u4f9b\u7528\u6237\u540d\u548c\u5bc6\u7801\u8fdb\u884c\u7528\u6237\u8eab\u4efd\u9a8c\u8bc1\u3002\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0clibcurl\u63d0\u4f9b\u4e86\u53e6\u4e00\u4e2a\u5c5e\u6027CURLOPT_PROXYUSERPWD\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_PROXYUSERPWD, \"user_name:password\");<\/pre>\n<\/div>\n<p>\u5728UNIX\u5e73\u53f0\u4e0b\uff0c\u8bbf\u95eeFTP\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\u53ef\u80fd\u4f1a\u88ab\u4fdd\u5b58\u5728$HOME\/.netrc\u6587\u4ef6\u4e2d\u3002libcurl\u652f\u6301\u76f4\u63a5\u4ece\u8fd9\u4e2a\u6587\u4ef6\u4e2d\u83b7\u53d6\u7528\u6237\u540d\u4e0e\u5bc6\u7801\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_NETRC, 1L);<\/pre>\n<\/div>\n<p>\u5728\u4f7f\u7528SSL\u65f6\uff0c\u53ef\u80fd\u9700\u8981\u63d0\u4f9b\u4e00\u4e2a\u79c1\u94a5\u7528\u4e8e\u6570\u636e\u5b89\u5168\u4f20\u8f93\uff0c\u901a\u8fc7CURLOPT_KEYPASSWD\u6765\u8bbe\u7f6e\u79c1\u94a5\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_KEYPASSWD, \"keypassword\");<\/pre>\n<\/div>\n<h3>HTTP\u9a8c\u8bc1<\/h3>\n<p>\u4e0a\u4e00\u7ae0\u4ecb\u7ecd\u4e86\u5982\u4f55\u5728libcurl\u4e2d\uff0c\u5bf9\u9700\u8981\u8eab\u4efd\u9a8c\u8bc1\u7684URL\u8bbe\u7f6e\u7528\u6237\u540d\u4e0e\u5bc6\u7801\u3002\u5728\u4f7f\u7528HTTP\u534f\u8bae\u65f6\uff0c\u5ba2\u6237\u7aef\u6709\u5f88\u591a\u79cd\u65b9\u5f0f\u5411\u670d\u52a1\u5668\u63d0\u4f9b\u9a8c\u8bc1\u4fe1\u606f\u3002\u9ed8\u8ba4\u7684 HTTP\u9a8c\u8bc1\u65b9\u6cd5\u662f&#8221;Basic\u201d\uff0c\u5b83\u5c06\u7528\u6237\u540d\u4e0e\u5bc6\u7801\u4ee5\u660e\u6587\u7684\u65b9\u5f0f\u3001\u7ecfBase64\u7f16\u7801\u540e\u4fdd\u5b58\u5728HTTP\u8bf7\u6c42\u5934\u4e2d\uff0c\u53d1\u5f80\u670d\u52a1\u5668\u3002\u5f53\u7136\u8fd9\u4e0d\u592a\u5b89\u5168\u3002<\/p>\n<p>\u5f53\u524d\u7248\u672c\u7684libcurl\u652f\u6301\u7684\u9a8c\u8bc1\u65b9\u6cd5\u6709\uff1abasic, Digest, NTLM, Negotiate, GSS-Negotiate and SPNEGO\u3002\uff08\u8bd1\u8005\u611f\u53f9\uff1a\u641eWeb\u8fd9\u4e48\u591a\u5e74\uff0c\u5c3d\u7136\u4e0d\u77e5\u9053\u8fd9\u4e9bHttp\u7684\u9a8c\u8bc1\u65b9\u5f0f\uff0c\u5b9e\u5728\u60ed\u6127\u3002\uff09\u53ef\u4ee5\u901a\u8fc7CURLOPT_HTTPAUTH\u5c5e\u6027\u6765\u8bbe\u7f6e\u5177\u4f53 \u7684\u9a8c\u8bc1\u65b9\u5f0f\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);<\/pre>\n<\/div>\n<p>\u5411\u4ee3\u7406\u670d\u52a1\u5668\u53d1\u9001\u9a8c\u8bc1\u4fe1\u606f\u65f6\uff0c\u53ef\u4ee5\u901a\u8fc7CURLOPT_PROXYAUTH\u8bbe\u7f6e\u9a8c\u8bc1\u65b9\u5f0f\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);<\/pre>\n<\/div>\n<p>\u4e5f\u53ef\u4ee5\u540c\u65f6\u8bbe\u7f6e\u591a\u79cd\u9a8c\u8bc1\u65b9\u5f0f\uff08\u901a\u8fc7\u6309\u4f4d\u4e0e\uff09\uff0c \u4f7f\u7528\u2018CURLAUTH_ANY\u2018\u5c06\u5141\u8bb8libcurl\u53ef\u4ee5\u9009\u62e9\u4efb\u4f55\u5b83\u6240\u652f\u6301\u7684\u9a8c\u8bc1\u65b9\u5f0f\u3002\u901a\u8fc7CURLOPT_HTTPAUTH\u6216 CURLOPT_PROXYAUTH\u5c5e\u6027\u8bbe\u7f6e\u7684\u591a\u79cd\u9a8c\u8bc1\u65b9\u5f0f\uff0clibcurl\u4f1a\u5728\u8fd0\u884c\u65f6\u9009\u62e9\u4e00\u79cd\u5b83\u8ba4\u4e3a\u662f\u6700\u597d\u7684\u65b9\u5f0f\u4e0e\u670d\u52a1\u5668\u901a\u4fe1\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_HTTPAUTH,  CURLAUTH_DIGEST|CURLAUTH_BASIC); \r\n\/\/ <strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_HTTPAUTH,  CURLAUTH_ANY);<\/pre>\n<\/div>\n<h3>HTTP Post<\/h3>\n<p>\u8fd9\u4e00\u7ae0\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528libcurl\u4ee5Post\u65b9\u5f0f\u5411HTTP\u670d\u52a1\u5668\u63d0\u4ea4\u6570\u636e\u3002<\/p>\n<p>\u65b9\u6cd5\u4e00\uff0c\u4e5f\u662f\u6700\u7b80\u5355\u7684\u65b9\u5f0f\uff0c\u5c31\u50cfhtml\u4e2d\u4f7f\u7528&lt;form&gt;\u6807\u7b7e\u63d0\u4ea4\u6570\u636e\u4e00\u6837\uff0c\u53ea\u9700\u5411libcurl\u63d0\u4f9b\u4e00\u4e2a\u5305\u542b\u6570\u636e\u7684\u5b57\u7b26\u4e32\u5373\u53ef\u3002\u4e0b\u9762\u662f\u7b14\u8005\u5b66\u4e60\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e2ademo\u7a0b\u5e8f\uff1a<\/p>\n<div>\n<pre>int main(int argc, char **argv)\r\n{\r\n\tcode = curl_global_init(CURL_GLOBAL_WIN32);\r\n\tCURL *easy_handle = curl_easy_init();\r\n\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_URL, <a href=\"http:\/\/localhost:2210\/Default.aspx%29;\/\/\">http:\/\/localhost:2210\/Default.aspx<\/a><a href=\"http:\/\/localhost:2210\/Default.aspx%29;\/\/\">);\r\n\t\/\/<\/a> \u5355\u4e2a\u57dfpost\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_POSTFIELDS, \"name=jgood&amp;address=hangzhou\");\r\n\tcode = curl_easy_perform(easy_handle);\r\n\r\n\tcurl_easy_cleanup(easy_handle);\r\n\tcurl_global_cleanup();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<\/div>\n<p>\u5728asp.net Web\u670d\u52a1\u5668\u4e0a\u8ddf\u8e2a\u8c03\u8bd5\uff0c\u5f97\u5230\u5ba2\u6237\u7a0b\u5e8f\u63d0\u4ea4\u4e0a\u6765\u7684\u6570\u636e\uff0c\u4e0b\u9762\u662f\u622a\u56fe\uff1a<a href=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"pic1\" alt=\"pic1\" src=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_thumb.jpg\" width=\"663\" height=\"244\" border=\"0\" \/> <\/a><\/p>\n<p>\u4e0a\u9762\u7684\u4ee3\u7801\u591f\u7b80\u5355\u5427~_~ \u6709\u65f6\u5019\uff0c\u6211\u4eec\u9700\u8981\u63d0\u4ea4\u4e00\u4e9b\u4e8c\u8fdb\u5236\u6570\u636e\u5230HTTP\u670d\u52a1\u5668\uff0c\u4f7f\u7528\u65b9\u6cd5\u4e00\u5c31\u4e0d\u884c\u4e86\uff0c\u56e0\u4e3a\u65b9\u6cd5\u4e00\u4e2d\u5b9e\u9645\u63d0\u4ea4\u7684\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\uff0c\u5b57\u7b26\u4e32\u9047\u5230\\0\u5c31\u8868\u793a\u7ed3\u675f\u4e86\u3002\u6240\u4ee5\u5728\u4e0a \u4f20\u4e8c\u8fdb\u5236\u6570\u636e\u7684\u65f6\u5019\uff0c\u5fc5\u987b\u660e\u786e\u7684\u544a\u8bc9libcurl\u8981\u63d0\u4ea4\u7684\u6570\u636e\u7684\u957f\u5ea6\u3002\u5728\u4e0a\u4f20\u4e8c\u8fdb\u5236\u6570\u636e\u7684\u65f6\u5019\uff0c\u8fd8\u5e94\u8be5\u8bbe\u7f6e\u63d0\u4ea4\u7684Content-Type\u5934\u4fe1\u606f\u3002\u4e0b\u9762 \u7684\u793a\u4f8b\u4ee3\u7801\uff1a<\/p>\n<div>\n<pre>int main(int argc, char **argv)\r\n{\r\n\tcurl_global_init(CURL_GLOBAL_WIN32);\r\n\tCURL *easy_handle = curl_easy_init();\r\n\r\n\t\/\/ \u4e0a\u4f20\u4e8c\u8fdb\u5236\u6570\u636e\r\n\tchar data[] = { 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0 };\r\n\tcurl_slist *http_headers = NULL;\r\n\thttp_headers = curl_slist_append(http_headers, \"Content-Type: text\/xml\");\r\n\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_HTTPHEADER, http_headers);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_URL, <a href=\"http:\/\/localhost:2210\/Default.aspx%29;curl_easy_setopt%28easy_handle\">http:\/\/localhost:2210\/Default.aspx<\/a><a href=\"http:\/\/localhost:2210\/Default.aspx%29;curl_easy_setopt%28easy_handle\">);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle<\/a>, CURLOPT_POSTFIELDS, data);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_POSTFIELDSIZE, sizeof(data));\r\n\r\n\tcurl_easy_perform(easy_handle);\r\n\r\n\tcurl_slist_free_all(http_headers);\r\n\tcurl_easy_cleanup(easy_handle);\r\n\tcurl_global_cleanup();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<\/div>\n<p>\u5728asp.net Web\u670d\u52a1\u5668\u4e0a\u8ddf\u8e2a\u8c03\u8bd5\uff0c\u5f97\u5230\u5ba2\u6237\u7a0b\u5e8f\u63d0\u4ea4\u4e0a\u6765\u7684\u4e8c\u8fdb\u5236\u6570\u636e\uff0c\u4e0b\u9762\u662f\u622a\u56fe\uff1a<a href=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_2.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"pic1\" alt=\"pic1\" src=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_thumb_2.jpg\" width=\"640\" height=\"422\" border=\"0\" \/> <\/a><\/p>\n<p>\u4e0a\u9762\u4ecb\u7ecd\u7684\u4e24\u79cd\u65b9\u5f0f\uff0c\u53ef\u4ee5\u5b8c\u6210\u5927\u90e8\u5206\u7684HTTP POST\u64cd\u4f5c\u3002\u4f46\u4e0a\u9762\u7684\u4e24\u79cd\u65b9\u5f0f\u90fd\u4e0d\u652f\u6301multi-part formposts\u3002Multi-part formposts\u88ab\u8ba4\u4e3a\u662f\u63d0\u4ea4\u4e8c\u8fdb\u5236\u6570\u636e(\u6216\u5927\u91cf\u6570\u636e)\u7684\u66f4\u597d\u65b9\u6cd5\uff0c\u53ef\u4ee5\u5728RFC1867, RFC2388\u4e2d\u627e\u5230\u4ed6\u4eec\u7684\u5b9a\u4e49\u3002\u4f55\u4e3aMulti-part\uff1f\u5176\u5b9e\uff0c\u5c31\u6211\u7406\u89e3\uff0c\u5c31\u662f\u5728Post\u63d0\u4ea4\u7684\u65f6\u5019\uff0c\u6709\u4e0d\u540c\u7684\u6570\u636e\u5355\u5143\uff0c\u6bcf\u4e2a\u5355\u5143\u6709\u81ea\u5df1\u7684\u540d\u79f0\u4e0e\u5185 \u5bb9\uff0c\u5185\u5bb9\u53ef\u4ee5\u662f\u6587\u672c\u7684\uff0c\u4e5f\u53ef\u4ee5\u662f\u4e8c\u8fdb\u5236\u7684\u3002\u540c\u65f6\uff0c\u6bcf\u4e2a\u6570\u636e\u5355\u5143\u90fd\u53ef\u4ee5\u6709\u81ea\u5df1\u7684\u6d88\u606f\u5934\uff0cMIME\u7c7b\u578b\uff0c\u8fd9\u4e9b\u6570\u636e\u5355\u5143\u7ec4\u6210\u4e00\u4e2a\u94fe\u8868\uff0c\u63d0\u4ea4\u5230HTTP\u670d\u52a1\u5668\u3002 libcurl\u63d0\u4f9b\u4e86\u65b9\u4fbf\u7684api\u7528\u4e8e\u652f\u6301multi-part formposts\u3002\u4f7f\u7528curl_formadd\u51fd\u6570\uff0c\u53ef\u4ee5\u6dfb\u52a0\u4e0d\u540c\u7684\u6570\u636e\u6570\u636e\u5355\u5143\uff0c\u7136\u540e\u63d0\u4ea4\u5230\u670d\u52a1\u5668\u3002\u4e0b\u9762\u662f\u4e00\u4e2amulti-part formposts\u7684\u4f8b\u5b50\uff08\u66f4\u8be6\u7ec6\u7684\u4f7f\u7528\uff0c\u8bf7\u53c2\u8003\uff1a<a title=\"http:\/\/curl.haxx.se\/libcurl\/c\/curl_formadd.html\" href=\"http:\/\/curl.haxx.se\/libcurl\/c\/curl_formadd.html\">http:\/\/curl.haxx.se\/libcurl\/c\/curl_formadd.html<\/a> \uff09\uff1a<\/p>\n<div>\n<pre>int main()\r\n{<\/pre>\n<p>curl_global_init(CURL_GLOBAL_WIN32);<br \/>\nCURL *easy_handle = curl_easy_init();<\/p>\n<pre>\t\/\/ \u4f7f\u7528multi-parts form post\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_URL, <a href=\"http:\/\/localhost:2210\/Default.aspx\">http:\/\/localhost:2210\/Default.aspx<\/a>);\r\n\tcurl_httppost *post = NULL;\r\n\tcurl_httppost *last = NULL;\t\r\n\r\n\t\/\/ \u6587\u672c\u6570\u636e\r\n\tcurl_formadd(&amp;post, &amp;last, CURLFORM_COPYNAME, \"name\", CURLFORM_COPYCONTENTS, \"JGood\", CURLFORM_END);\r\n\tcurl_formadd(&amp;post, &amp;last, CURLFORM_COPYNAME, \"address\", CURLFORM_COPYCONTENTS, \"HangZhou\", CURLFORM_END);\r\n\r\n\t\/\/ \u6587\u672c\u6587\u4ef6\u4e2d\u7684\u6570\u636e\r\n\tcurl_formadd(&amp;post, &amp;last, CURLFORM_COPYNAME, \"file\", CURLFORM_FILECONTENT, \"ReadMe.txt\", CURLFORM_END);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_HTTPPOST, post);\r\n\tcurl_easy_perform(easy_handle);\r\n\r\n\tcurl_formfree(post);\r\n\tcurl_easy_cleanup(easy_handle);\r\n\tcurl_global_cleanup();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<\/div>\n<p>\u6700\u540e\u8981\u8bf4\u660e\u7684\u662f\uff0c\u6240\u6709\u5728easy handle\u4e0a\u8bbe\u7f6e\u7684\u5c5e\u6027\u90fd\u662f\u201dsticky\u201d\u7684\uff0c\u4ec0\u4e48\u610f\u601d\uff1f\u5c31\u662f\u8bf4\u5728easy handle\u4e0a\u8bbe\u7f6e\u7684\u5c5e\u6027\u90fd\u5c06\u88ab\u4fdd\u5b58\uff0c\u5373\u4f7f\u6267\u884c\u5b8ccurl_easy_perform\u4e4b\u540e\uff0c\u8fd9\u4e9b\u5c5e\u6027\u503c\u4ecd\u7136\u5b58\u5728\u3002\u901a\u8fc7\u5c06CURLOPT_HTTPGET\u8bbe \u4e3a1\u53ef\u4ee5\u4f7feasy handle\u56de\u5230\u6700\u539f\u59cb\u7684\u72b6\u6001\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_HTTPGET, 1L);<\/pre>\n<\/div>\n<h3>\u663e\u793a\u8fdb\u5ea6<\/h3>\n<p>libcurl\u652f\u6301\u901a\u4fe1\u8fc7\u7a0b\u4e2d\u7684\u8fdb\u5ea6\u63a7\u5236\u3002\u901a\u8fc7\u5c06CURLOPT_NOPROCESS\u8bbe\u7f6e\u4e3a0\u5f00\u542f\u8fdb\u5ea6\u652f\u6301\u3002\u8be5\u9009\u9879\u9ed8\u8ba4\u503c\u4e3a1\u3002\u5bf9\u5927\u591a\u6570\u5e94\u7528\u7a0b\u5e8f\uff0c\u6211\u4eec\u9700 \u8981\u63d0\u4f9b\u4e00\u4e2a\u8fdb\u5ea6\u663e\u793a\u56de\u8c03\u3002libcurl\u4f1a\u4e0d\u5b9a\u671f\u7684\u5c06\u5f53\u524d\u4f20\u8f93\u7684\u8fdb\u5ea6\u901a\u8fc7\u56de\u8c03\u51fd\u6570\u544a\u8bc9\u4f60\u7684\u7a0b\u5e8f\u3002\u56de\u8c03\u51fd\u6570\u7684\u539f\u578b\u5982\u4e0b\uff1a<\/p>\n<div>\n<pre>int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);<\/pre>\n<\/div>\n<p>\u901a\u8fc7CURLOPT_PROGRESSFUNCTION\u6ce8\u518c\u8be5\u56de\u8c03\u51fd\u6570\u3002\u53c2\u6570clientp\u662f\u4e00\u4e2a\u7528\u6237\u81ea\u5b9a\u4e49\u6307\u9488\uff0c\u5e94\u7528\u7a0b\u5e8f\u901a\u8fc7 CURLOPT_PROCESSDATA\u5c5e\u6027\u5c06\u8be5\u81ea\u5b9a\u4e49\u6307\u5b9a\u4f20\u9012\u7ed9libcurl\u3002libcurl\u5bf9\u8be5\u53c2\u6570\u4e0d\u4f5c\u4efb\u4f55\u5904\u7406\uff0c\u53ea\u662f\u7b80\u5355\u5c06\u5176\u4f20\u9012\u7ed9\u56de\u8c03\u51fd\u6570\u3002<\/p>\n<h3>\u5728C++\u4e2d\u4f7f\u7528libcurl<\/h3>\n<p>\u5728C++\u4e2d\u4f7f\u7528libcurl\u8ddf\u5728C\u8bed\u8a00\u4e2d\u6ca1\u6709\u4efb\u4f55\u533a\u522b\uff0c\u53ea\u6709\u4e00\u4e2a\u5730\u65b9\u8981\u6ce8\u610f\uff1a\u56de\u8c03\u51fd\u6570\u4e0d\u80fd\u662f\u7c7b\u7684\u975e\u9759\u6001\u6210\u5458\u51fd\u6570\u3002\u4f8b\u5982\uff1a<\/p>\n<div>\n<pre>class AClass { \r\n     static size_t write_data(void *ptr, size_t size, size_t nmemb, void *ourpointer) \r\n     { \r\n       \/* do what you want with the data *\/\r\n     } \r\n}<\/pre>\n<\/div>\n<h3>\u4ee3\u7406<\/h3>\n<p>\u4ec0\u4e48\u662f\u4ee3\u7406\uff1fMerrian-Webster\u7684\u89e3\u91ca\u662f\uff1a\u4e00\u4e2a\u901a\u8fc7\u9a8c\u8bc1\u7684\u7528\u6237\u626e\u6f14\u53e6\u4e00\u4e2a\u7528\u6237\u3002\u4eca\u5929\uff0c\u4ee3\u7406\u5df2\u7ecf\u88ab\u5e7f\u6cdb\u7684\u4f7f\u7528\u3002\u8bb8\u591a\u516c\u53f8\u63d0\u4f9b\u7f51\u7edc\u4ee3\u7406\u670d\u52a1\u5668\uff0c\u5141\u8bb8\u5458\u5de5\u7684\u7f51\u7edc\u5ba2\u6237\u7aef\u8bbf\u95ee\u3001\u4e0b\u8f7d\u6587\u4ef6\u3002\u4ee3\u7406\u670d\u52a1\u5668\u5904\u7406\u8fd9\u4e9b\u7528\u6237\u7684\u8bf7\u6c42\u3002<\/p>\n<p>libcurl\u652f\u6301SOCKS\u548cHTTP\u4ee3\u7406\u3002\u4f7f\u7528\u4ee3\u7406\uff0clibcurl\u4f1a\u628a\u7528\u6237\u8f93\u5165\u7684URL\u63d0\u4ea4\u7ed9\u4ee3\u7406\u670d\u52a1\u5668\uff0c\u800c\u4e0d\u662f\u76f4\u63a5\u6839\u636eURL\u53bb\u8bbf\u95ee\u8fdc\u7a0b\u8d44\u6e90\u3002<\/p>\n<p>\u5f53\u524d\u7248\u672c\u7684libcurl\u5e76\u4e0d\u652f\u6301SOCKS\u4ee3\u7406\u7684\u6240\u6709\u529f\u80fd\u3002<\/p>\n<p>\u5bf9\u4e8eHTTP\u4ee3\u7406\u6765\u8bf4\uff0c\u5373\u4f7f\u8bf7\u6c42\u7684URL\u4e0d\u662f\u4e00\u4e2a\u5408\u6cd5\u7684HTTP URL\uff08\u6bd4\u65b9\u4f60\u63d0\u4f9b\u4e86\u4e00\u4e2aftp\u7684url\uff09\uff0c\u5b83\u4ecd\u7136\u4f1a\u5148\u88ab\u63d0\u4ea4\u5230HTTP\u4ee3\u7406\u3002<\/p>\n<h5>\u4ee3\u7406\u9009\u9879<\/h5>\n<p>CURLOPT_PROXY\u5c5e\u6027\u7528\u4e8e\u8bbe\u7f6elibcurl\u4f7f\u7528\u7684\u4ee3\u7406\u670d\u52a1\u5668\u5730\u5740\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_PROXY, \"proxy-host.com:8080\");<\/pre>\n<\/div>\n<p>\u53ef\u4ee5\u628a\u4e3b\u673a\u540d\u4e0e\u7aef\u53e3\u53f7\u5206\u5f00\u8bbe\u7f6e\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_PROXY, \"proxy-host.com\"); \r\n<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_PROXYPORT, \"8080\");  \/\/ \u7aef\u53e3\u53f7\u662f\u7528\u5b57\u7b26\u4e32\u8fd8\u662f\u6574\u6570\uff1f\uff1f<\/pre>\n<\/div>\n<p>\u6709\u4e9b\u4ee3\u7406\u670d\u52a1\u5668\u8981\u6c42\u7528\u6237\u901a\u8fc7\u9a8c\u8bc1\u4e4b\u540e\u624d\u5141\u8bb8\u63a5\u53d7\u5176\u8bf7\u6c42\uff0c\u6b64\u65f6\u5e94\u8be5\u5148\u63d0\u4f9b\u9a8c\u8bc1\u4fe1\u606f\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_PROXYUSERPWD, \"user:password\");<\/pre>\n<\/div>\n<p>\u8fd8\u8981\u544a\u8bc9libcurl\u4f7f\u7528\u7684\u4ee3\u7406\u7c7b\u578b\uff08\u5982\u679c\u6ca1\u6709\u63d0\u4f9b\uff0clibcurl\u4f1a\u8ba4\u4e3a\u662fHTTP\u4ee3\u7406\uff09\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);<\/pre>\n<\/div>\n<h5>\u73af\u5883\u53d8\u91cf<\/h5>\n<p>\u5bf9\u4e8e\u6709\u4e9b\u534f\u8bae\uff0clibcurl\u4f1a\u81ea\u52a8\u68c0\u6d4b\u5e76\u4f7f\u7528\u4e00\u4e9b\u73af\u5883\u53d8\u91cf\uff0c\u5e76\u6839\u636e\u8fd9\u4e9b\u73af\u5883\u53d8\u91cf\u6765\u786e\u5b9a\u8981\u4f7f\u7528\u7684\u4ee3\u7406\u670d\u52a1\u5668\u3002\u8fd9\u4e9b\u73af\u5883\u53d8\u91cf\u7684\u540d\u79f0\u683c\u5f0f\u4e00\u822c\u662f&#8221; [protocol]_proxy&#8221;\uff08\u6ce8\u610f\u5c0f\u5199\uff09\u3002\u4f8b\u5982\u8f93\u5165\u4e00\u4e2aHTTP\u7684URL\uff0c\u90a3\u4e48\u540d\u79f0\u4e3a&#8221;http_proxy&#8221;\u7684\u73af\u5883\u53d8\u91cf\u5c31\u4f1a\u88ab\u68c0\u6d4b\u662f\u5426\u5b58\u5728\uff0c\u5982 \u679c\u5b58\u5728\uff0clibcurl\u4f1a\u4f7f\u7528\u8be5\u73af\u5883\u53d8\u91cf\u6307\u5b9a\u7684\u4ee3\u7406\u3002\u76f8\u540c\u7684\u89c4\u5219\u4e5f\u9002\u7528\u4e8eFTP\u3002<\/p>\n<p>\u8fd9\u4e9b\u73af\u5883\u53d8\u91cf\u7684\u503c\u7684\u683c\u5f0f\u5fc5\u987b\u662f\u8fd9\u6837\u7684\uff1a&#8221;[protocol:\/\/][user:password@]machine[:port]&#8221;\u3002libcurl\u4f1a\u5ffd\u7565\u6389[protocol:\/\/]\uff0c\u5982\u679c\u6ca1\u6709\u63d0\u4f9b\u7aef\u53e3\u53f7\uff0clibcurl\u4f7f\u7528\u8be5\u534f\u8bae\u7684\u9ed8\u8ba4\u7aef\u53e3\u3002<\/p>\n<p>\u6709\u4e24\u4e2a\u6bd4\u8f83\u7279\u6b8a\u7684\u73af\u5883\u53d8\u91cf\uff1a&#8217;all_proxy&#8217;\u4e0e&#8217;no_proxy&#8217;\u3002\u5982\u679c\u4e00\u4e2aURL\u6240\u5bf9\u5e94\u7684\u534f\u8bae\uff0c\u5b83\u7684\u73af\u5883\u53d8\u91cf\u6ca1\u6709\u8bbe\u7f6e\uff0c\u90a3\u4e48 &#8216;all_proxy&#8217;\u6307\u5b9a\u7684\u4ee3\u7406\u5c06\u88ab\u4f7f\u7528\u3002&#8217;no_proxy&#8217;\u5219\u6307\u5b9a\u4e86\u4e00\u4e2a\u4e0d\u5e94\u88ab\u4f7f\u7528\u7684\u4ee3\u7406\u4e3b\u673a\u7684\u5217\u8868\u3002\u4f8b\u5982\uff1ano_proxy\u7684\u503c\u662f &#8216;192.168.1.10&#8217;\uff0c\u5373\u4f7f\u5b58\u5728http_proxy\uff0c\u5b83\u7684\u503c\u4e5f\u662f&#8217;192.168.1.10&#8217;\uff0c&#8217;192.168.1.10&#8217;\u4e5f\u4e0d\u4f1a\u88ab\u4f5c\u4e3a\u4ee3 \u7406\u3002no_proxy=\u201d*\u201d\u8868\u793a\u4e0d\u5141\u8bb8\u4f7f\u7528\u4efb\u4f55\u4ee3\u7406\u3002<\/p>\n<p>\u663e\u5f0f\u5730\u5c06CURLOPT_PROXY\u5c5e\u6027\u8bbe\u7f6e\u4e3a\u7a7a\uff0c\u53ef\u4ee5\u7981\u6b62libcurl\u68c0\u67e5\u5e76\u4f7f\u7528\u73af\u5883\u53d8\u91cf\u6765\u4f7f\u7528\u4ee3\u7406\u3002<\/p>\n<h5>SSL\u548c\u4ee3\u7406<\/h5>\n<p>SSL\u4e3a\u70b9\u5230\u70b9\u901a\u4fe1\u63d0\u4f9b\u5b89\u5168\u4fdd\u969c\u3002\u5b83\u5305\u542b\u4e00\u4e9b\u5f3a\u58ee\u7684\u52a0\u5bc6\u63aa\u65bd\u548c\u5176\u4ed6\u5b89\u5168\u68c0\u6d4b\uff0c\u8fd9\u4f7f\u5f97\u4e0a\u9762\u8bb2\u5230\u7684\u4ee3\u7406\u65b9\u5f0f\u4e0d\u9002\u7528\u4e8eSSL\u3002\u9664\u975e\u4ee3\u7406\u670d\u52a1\u5668\u63d0\u4f9b\u4e13\u7528\u901a\u9053\uff0c\u5bf9\u8fdb \u51fa\u8be5\u4ee3\u7406\u670d\u52a1\u5668\u7684\u6570\u636e\u4e0d\u4f5c\u4efb\u4f55\u68c0\u6d4b\u6216\u7981\u6b62\u3002\u901a\u8fc7HTTP\u4ee3\u7406\u670d\u52a1\u5668\u6253\u5f00SSL\u8fde\u63a5\uff0c\u610f\u5473\u7740\u4ee3\u7406\u670d\u52a1\u5668\u8981\u76f4\u63a5\u8fde\u63a5\u5230\u76ee\u6807\u4e3b\u673a\u7684\u6307\u5b9a\u7aef\u53e3\u3002\u56e0\u4e3a\u4ee3\u7406\u670d\u52a1\u5668\u5bf9\u5728 \u4e13\u7528\u901a\u9053\u4e0a\u4f20\u8f93\u7684\u6570\u636e\u7684\u7c7b\u578b\u6beb\u65e0\u6240\u77e5\uff0c\u6240\u4ee5\u5b83\u5f80\u5f80\u4f1a\u4f7f\u67d0\u4e9b\u673a\u5236\u5931\u6548\uff0c\u5982\u7f13\u5b58\u673a\u5236\u3002\u8bb8\u591a\u7ec4\u7ec7\u53ea\u5141\u8bb8\u5728443\u7aef\u53e3\u4e0a\u521b\u5efa\u8fd9\u79cd\u7c7b\u578b\u7684\u6570\u636e\u901a\u9053\u3002<\/p>\n<h5>\u4ee3\u7406\u901a\u9053(Tunneling Through Proxy)<\/h5>\n<p>\u6b63\u5982\u4e0a\u9762\u8bb2\u5230\u7684\uff0c\u8981\u4f7fSSL\u5de5\u4f5c\u5fc5\u987b\u5728\u4ee3\u7406\u670d\u52a1\u5668\u521b\u5efa\u4e13\u7528\u6570\u636e\u901a\u9053\uff0c\u901a\u5e38\u4e13\u7528\u901a\u9053\u53ea\u88ab\u9650\u5236\u5e94\u7528\u4e8eHTTPS\u3002\u901a\u8fc7HTTP\u4ee3\u7406\u5728\u5e94\u7528\u7a0b\u5e8f\u4e0e\u76ee\u6807\u4e4b\u95f4\u521b\u5efa\u4e00 \u4e2a\u4e13\u7528\u6570\u636e\u901a\u9053\uff0c\u5e94\u8be5\u9884\u9632\u5728\u8be5\u4e13\u6709\u901a\u9053\u4e0a\u6267\u884c\u975eHTTP\u7684\u64cd\u4f5c\uff0c\u5982\u8fdb\u884cFTP\u4e0a\u4f20\u6216\u6267\u884cFTP\u547d\u4ee4\u3002\u4ee3\u7406\u670d\u52a1\u5668\u7ba1\u7406\u5458\u5e94\u8be5\u7981\u6b62\u975e\u6cd5\u7684\u64cd\u4f5c\u3002<\/p>\n<p>\u901a\u8fc7CURLOPT_HTTPPROXYTUNNEL\u5c5e\u6027\u6765\u544a\u8bc9libcurl\u4f7f\u7528\u4ee3\u7406\u901a\u9053\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_HTTPPROXYTUNNEL, 1L);<\/pre>\n<\/div>\n<p>\u6709\u65f6\u5019\u4f60\u60f3\u901a\u8fc7\u4ee3\u7406\u901a\u9053\u6267\u884c\u5e73\u5e38\u7684HTTP\u64cd\u4f5c\uff0c\u800c\u5b9e\u9645\u4e0a\u5374\u53ef\u80fd\u4f7f\u4f60\u4e0d\u7ecf\u8fc7\u4ee3\u7406\u670d\u52a1\u5668\u800c\u76f4\u63a5\u4e0e\u8fdc\u7a0b\u4e3b\u673a\u8fdb\u884c\u4ea4\u4e92\u3002libcurl\u4e0d\u4f1a\u4ee3\u66ff\u8fd9\u79cd\u65b0\u5f15\u5165\u7684\u884c\u4e3a\u3002<\/p>\n<h5>\u81ea\u52a8\u914d\u7f6e\u4ee3\u7406<\/h5>\n<p>\u8bb8\u591a\u6d4f\u89c8\u5668\u652f\u6301\u81ea\u52a8\u914d\u7f6e\u4ee3\u7406\uff0c\u4f8b\u5982NetScape\u3002libcurl\u5e76\u4e0d\u652f\u6301\u8fd9\u4e9b\u3002<\/p>\n<h3>\u6301\u4e45\u5316\u7684\u597d\u5904(Persistence Is The Way to Happiness)<\/h3>\n<p>\u5f53\u9700\u8981\u53d1\u9001\u591a\u6b21\u8bf7\u6c42\u65f6\uff0c\u5e94\u8be5\u91cd\u590d\u4f7f\u7528easy handle\u3002<\/p>\n<p>\u6bcf\u6b21\u6267\u884c\u5b8ccurl_easy_perform\uff0clicurl\u4f1a\u7ee7\u7eed\u4fdd\u6301\u4e0e\u670d\u52a1\u5668\u7684\u8fde\u63a5\u3002\u63a5\u4e0b\u6765\u7684\u8bf7\u6c42\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e2a\u8fde\u63a5\u800c\u4e0d\u5fc5\u521b\u5efa\u65b0\u7684\u8fde\u63a5\uff08\u5982\u679c\u76ee\u6807\u4e3b\u673a\u662f\u540c\u4e00\u4e2a\u7684\u8bdd\uff09\u3002\u8fd9\u6837\u53ef\u4ee5\u51cf\u5c11\u7f51\u7edc\u5f00\u9500\u3002<br \/>\n\u5373\u4f7f\u8fde\u63a5\u88ab\u91ca\u653e\u4e86\uff0clibcurl\u4e5f\u4f1a\u7f13\u5b58\u8fd9\u4e9b\u8fde\u63a5\u7684\u4f1a\u8bdd\u4fe1\u606f\uff0c\u8fd9\u6837\u4e0b\u6b21\u518d\u8fde\u63a5\u5230\u76ee\u6807\u4e3b\u673a\u4e0a\u65f6\uff0c\u5c31\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e9b\u4fe1\u606f\uff0c\u4ece\u800c\u51cf\u5c11\u91cd\u65b0\u8fde\u63a5\u6240\u9700\u7684\u65f6\u95f4\u3002<\/p>\n<p>FTP\u8fde\u63a5\u53ef\u80fd\u4f1a\u88ab\u4fdd\u5b58\u8f83\u957f\u7684\u65f6\u95f4\u3002\u56e0\u4e3a\u5ba2\u6237\u7aef\u8981\u4e0eFTP\u670d\u52a1\u5668\u8fdb\u884c\u9891\u7e41\u7684\u547d\u4ee4\u4ea4\u4e92\u3002\u5bf9\u4e8e\u6709\u8bbf\u95ee\u4eba\u6570\u4e0a\u9650\u7684FTP\u670d\u52a1\u5668\uff0c\u4fdd\u6301\u4e00\u4e2a\u957f\u8fde\u63a5\uff0c\u53ef\u4ee5\u4f7f\u4f60\u4e0d\u9700\u8981\u6392\u9664\u7b49\u5f85\uff0c\u5c31\u76f4\u63a5\u53ef\u4ee5\u4e0eFTP\u670d\u52a1\u5668\u901a\u4fe1\u3002<\/p>\n<p>libcurl\u4f1a\u7f13\u5b58DNS\u7684\u89e3\u6790\u7ed3\u679c\u3002<\/p>\n<p>\u5728\u4eca\u540e\u7684libcurl\u7248\u672c\u4e2d\uff0c\u8fd8\u4f1a\u6dfb\u52a0\u4e00\u4e9b\u7279\u6027\u6765\u63d0\u9ad8\u6570\u636e\u901a\u4fe1\u7684\u6548\u7387\u3002<br \/>\n\u6bcf\u4e2aeasy handle\u90fd\u4f1a\u4fdd\u5b58\u6700\u8fd1\u4f7f\u7528\u7684\u51e0\u4e2a\u8fde\u63a5\uff0c\u4ee5\u5907\u91cd\u7528\u3002\u9ed8\u8ba4\u662f5\u4e2a\u3002\u53ef\u4ee5\u901a\u8fc7CURLOPT_MAXCONNECTS\u5c5e\u6027\u6765\u8bbe\u7f6e\u4fdd\u5b58\u8fde\u63a5\u7684\u6570\u91cf\u3002<\/p>\n<p>\u5982\u679c\u4f60\u4e0d\u60f3\u91cd\u7528\u8fde\u63a5\uff0c\u5c06CURLOPT_FRESH_CONNECT\u5c5e\u6027\u8bbe\u7f6e\u4e3a1\u3002\u8fd9\u6837\u6bcf\u6b21\u63d0\u4ea4\u8bf7\u6c42\u65f6\uff0clibcurl\u90fd\u4f1a\u5148\u5173\u95ed\u4ee5\u524d\u521b\u5efa\u7684\u8fde\u63a5\uff0c\u7136\u540e\u91cd \u65b0\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u8fde\u63a5\u3002\u4e5f\u53ef\u4ee5\u5c06CURLOPT_FORBID_REUSE\u8bbe\u7f6e\u4e3a1\uff0c\u8fd9\u6837\u6bcf\u6b21\u6267\u884c\u5b8c\u8bf7\u6c42\uff0c\u8fde\u63a5\u5c31\u4f1a\u9a6c\u4e0a\u5173\u95ed\u3002<\/p>\n<h3>libcurl\u4f7f\u7528\u7684HTTP\u6d88\u606f\u5934<\/h3>\n<p>\u5f53\u4f7f\u7528libcurl\u53d1\u9001http\u8bf7\u6c42\u65f6\uff0c\u5b83\u4f1a\u81ea\u52a8\u6dfb\u52a0\u4e00\u4e9bhttp\u5934\u3002\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7CURLOPT_HTTPHEADER\u5c5e\u6027\u624b\u52a8\u66ff\u6362\u3001\u6dfb\u52a0\u6216\u5220\u9664\u76f8\u5e94\u7684HTTP\u6d88\u606f\u5934\u3002<\/p>\n<h5>Host<\/h5>\n<p>http1.1\uff08\u5927\u90e8\u5206http1.0)\u7248\u672c\u90fd\u8981\u6c42\u5ba2\u6237\u7aef\u8bf7\u6c42\u63d0\u4f9b\u8fd9\u4e2a\u4fe1\u606f\u5934\u3002<\/p>\n<h5>Pragma<\/h5>\n<p>&#8220;no-cache&#8221;\u3002\u8868\u793a\u4e0d\u8981\u7f13\u51b2\u6570\u636e\u3002<\/p>\n<h5>Accept<\/h5>\n<p>&#8220;*\/*&#8221;\u3002\u8868\u793a\u5141\u8bb8\u63a5\u6536\u4efb\u4f55\u7c7b\u578b\u7684\u6570\u636e\u3002<\/p>\n<h5>Expect<\/h5>\n<p>\u4ee5POST\u7684\u65b9\u5f0f\u5411HTTP\u670d\u52a1\u5668\u63d0\u4ea4\u8bf7\u6c42\u65f6\uff0clibcurl\u4f1a\u8bbe\u7f6e\u8be5\u6d88\u606f\u5934\u4e3a&#8221;100-continue&#8221;\uff0c\u5b83\u8981\u6c42\u670d\u52a1\u5668\u5728\u6b63\u5f0f\u5904\u7406\u8be5\u8bf7\u6c42\u4e4b\u524d\uff0c\u8fd4\u56de\u4e00\u4e2a&#8221;OK&#8221;\u6d88\u606f\u3002\u5982\u679cPOST\u7684\u6570\u636e\u5f88\u5c0f\uff0clibcurl\u53ef\u80fd\u4e0d\u4f1a\u8bbe\u7f6e\u8be5\u6d88\u606f\u5934\u3002<\/p>\n<h3>\u81ea\u5b9a\u4e49\u9009\u9879<\/h3>\n<p>\u5f53\u524d\u8d8a\u6765\u8d8a\u591a\u7684\u534f\u8bae\u90fd\u6784\u5efa\u5728HTTP\u534f\u8bae\u4e4b\u4e0a\uff08\u5982\uff1asoap\uff09\uff0c\u8fd9\u4e3b\u8981\u5f52\u529f\u4e8eHTTP\u7684\u53ef\u9760\u6027\uff0c\u4ee5\u53ca\u88ab\u5e7f\u6cdb\u4f7f\u7528\u7684\u4ee3\u7406\u652f\u6301\uff08\u53ef\u4ee5\u7a7f\u900f\u5927\u90e8\u5206\u9632\u706b\u5899\uff09\u3002 \u8fd9\u4e9b\u534f\u8bae\u7684\u4f7f\u7528\u65b9\u5f0f\u4e0e\u4f20\u7edfHTTP\u53ef\u80fd\u6709\u5f88\u5927\u7684\u4e0d\u540c\u3002\u5bf9\u6b64\uff0clibcurl\u4f5c\u4e86\u5f88\u597d\u7684\u652f\u6301\u3002<\/p>\n<h5>\u81ea\u5b9a\u4e49\u8bf7\u6c42\u65b9\u5f0f(CustomRequest)<\/h5>\n<p>HTTP\u652f\u6301GET, HEAD\u6216\u8005POST\u63d0\u4ea4\u8bf7\u6c42\u3002\u53ef\u4ee5\u8bbe\u7f6eCURLOPT_CUSTOMREQUEST\u6765\u8bbe\u7f6e\u81ea\u5b9a\u4e49\u7684\u8bf7\u6c42\u65b9\u5f0f\uff0clibcurl\u9ed8\u8ba4\u4ee5GET\u65b9\u5f0f\u63d0\u4ea4\u8bf7\u6c42\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_CUSTOMREQUEST, \"MYOWNREQUEST\");<\/pre>\n<\/div>\n<h5>\u4fee\u6539\u6d88\u606f\u5934<\/h5>\n<p>HTTP\u534f\u8bae\u63d0\u4f9b\u4e86\u6d88\u606f\u5934\uff0c\u8bf7\u6c42\u6d88\u606f\u5934\u7528\u4e8e\u544a\u8bc9\u670d\u52a1\u5668\u5982\u4f55\u5904\u7406\u8bf7\u6c42\uff1b\u54cd\u5e94\u6d88\u606f\u5934\u5219\u544a\u8bc9\u6d4f\u89c8\u5668\u5982\u4f55\u5904\u7406\u63a5\u6536\u5230\u7684\u6570\u636e\u3002\u5728libcurl\u4e2d\uff0c\u4f60\u53ef\u4ee5\u81ea\u7531\u7684\u6dfb\u52a0\u8fd9\u4e9b\u6d88\u606f\u5934\uff1a<\/p>\n<div>\n<pre>struct curl_slist *headers=NULL; \/* init to NULL is important *\/\r\nheaders = curl_slist_append(headers, \"Hey-server-hey: how are you?\");\r\nheaders = curl_slist_append(headers, \"X-silly-content: yes\");\r\n\/* pass our list of custom made headers *\/\r\n<strong>curl_easy_setopt<\/strong>(easyhandle, CURLOPT_HTTPHEADER, headers);\r\ncurl_easy_perform(easyhandle); \/* transfer http *\/\r\ncurl_slist_free_all(headers); \/* free the header list *\/<\/pre>\n<\/div>\n<p>\u5bf9\u4e8e\u5df2\u7ecf\u5b58\u5728\u7684\u6d88\u606f\u5934\uff0c\u53ef\u4ee5\u91cd\u65b0\u8bbe\u7f6e\u5b83\u7684\u503c\uff1a<\/p>\n<div>\n<pre>headers = curl_slist_append(headers, \"Accept: Agent-007\");  \r\nheaders = curl_slist_append(headers, \"Host: munged.host.line\");<\/pre>\n<\/div>\n<h5>\u5220\u9664\u6d88\u606f\u5934<\/h5>\n<p>\u5bf9\u4e8e\u4e00\u4e2a\u5df2\u7ecf\u5b58\u5728\u7684\u6d88\u606f\u5934\uff0c\u8bbe\u7f6e\u5b83\u7684\u5185\u5bb9\u4e3a\u7a7a\uff0clibcurl\u5728\u53d1\u9001\u8bf7\u6c42\u65f6\u5c31\u4e0d\u4f1a\u540c\u65f6\u63d0\u4ea4\u8be5\u6d88\u606f\u5934\uff1a<\/p>\n<div>\n<pre>headers = curl_slist_append(headers, \"Accept:\");<\/pre>\n<\/div>\n<h3>\u5f3a\u5236\u5206\u5757\u4f20\u8f93(Enforcing chunked transfer-encoding)<\/h3>\n<p>\uff08\u8fd9\u6bb5\u6587\u5b57\u7406\u89e3\u53ef\u80fd\u6709\u8bef\u7801\uff09\u4ee5\u975eGET\u7684\u65b9\u5f0f\u63d0\u4ea4HTTP\u8bf7\u6c42\u65f6\uff0c\u5982\u679c\u8bbe\u7f6e\u4e86\u81ea\u5b9a\u4e49\u7684\u6d88\u606f\u5934\u201dTransfer- Encoding:chunked\u201d\uff0clibcurl\u4f1a\u5206\u5757\u63d0\u4ea4\u6570\u636e\uff0c\u5373\u4f7f\u8981\u4e0a\u4f20\u7684\u6570\u636e\u91cf\u5df2\u7ecf\u77e5\u9053\u3002\u5728\u4e0a\u4f20\u6570\u636e\u5927\u5c0f\u672a\u77e5\u7684\u60c5\u51b5\u4e0b\uff0clibcurl\u81ea\u52a8\u91c7\u7528 \u5206\u5757\u4e0a\u4f20\u6570\u636e\u3002\uff08\u8bd1\u8005\u6ce8\uff1a\u975eGET\u65b9\u5f0f\u63d0\u4ea4\u8bf7\u6c42\uff0c\u63d0\u4ea4\u7684\u6570\u636e\u91cf\u5f80\u5f80\u6bd4\u8f83\u5927\u3002\uff09<\/p>\n<h3>HTTP\u7248\u672c<\/h3>\n<p>\u6bcf\u4e00\u6b21http\u8bf7\u6c42\uff0c\u90fd\u5305\u542b\u4e00\u4e2a\u8868\u793a\u5f53\u524d\u4f7f\u7528http\u7248\u672c\u7684\u6d88\u606f\u5934\u3002libcurl\u9ed8\u8ba4\u4f7f\u7528HTTP 1.1\u3002\u53ef\u4ee5\u901a\u8fc7CURLOPT_HTTP_VERSION\u5c5e\u6027\u6765\u8bbe\u7f6e\u5177\u4f53\u7684\u7248\u672c\u53f7\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);<\/pre>\n<\/div>\n<h3>FTP\u81ea\u5b9a\u4e49\u547d\u4ee4<\/h3>\n<p>\u5e76\u4e0d\u662f\u6240\u4ee5\u7684\u534f\u8bae\u90fd\u50cfHTTP\u90a3\u6837\uff0c\u901a\u8fc7\u6d88\u606f\u5934\u6765\u544a\u8bc9\u670d\u52a1\u5668\u5982\u4f55\u5904\u7406\u8bf7\u6c42\u3002\u5bf9\u4e8eFTP\uff0c\u4f60\u5c31\u8981\u4f7f\u7528\u53e6\u5916\u7684\u65b9\u5f0f\u6765\u5904\u7406\u3002<\/p>\n<p>\u53d1\u9001\u81ea\u5b9a\u4e49\u7684\u547d\u4ee4\u5230ftp\u670d\u52a1\u5668\uff0c\u610f\u5473\u7740\u4f60\u53d1\u9001\u7684\u547d\u4ee4\u5fc5\u987b\u662f\u80fd\u88abftp\u670d\u52a1\u5668\u7406\u89e3\u7684\u547d\u4ee4\uff08FTP\u534f\u8bae\u4e2d\u5b9a\u4e49\u7684\u547d\u4ee4\uff0c\u53c2\u8003rfc959\uff09\u3002<\/p>\n<p>\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\uff0c\u5728\u6587\u4ef6\u4f20\u8f93\u64cd\u4f5c\u64cd\u4f5c\u4e4b\u524d\u5220\u9664\u6307\u5b9a\u6587\u4ef6\uff1a<\/p>\n<div>\n<pre>headers = curl_slist_append(headers, \"DELE file-to-remove\");\r\n\/* pass the list of custom commands to the handle *\/\r\n\r\n<strong>curl_easy_setopt<\/strong>(easyhandle, CURLOPT_QUOTE, headers);\r\n\/\/ <strong>curl_easy_setopt<\/strong>(easyhandle, CURLOPT_POSTQUOTE, headers); \/\/ \u5728\u6570\u636e\u4f20\u8f93\u4e4b\u540e\u64cd\u884c\u5220\u9664\u64cd\u4f5c<\/pre>\n<pre>curl_easy_perform(easyhandle); \/* transfer ftp data! *\/\r\ncurl_slist_free_all(headers); \/* free the header list *\/<\/pre>\n<\/div>\n<p>FTP\u670d\u52a1\u5668<a name=\"baidusnap5\"><\/a><strong>\u6267\u884c\u547d\u4ee4<\/strong>\u7684\u987a\u5e8f\uff0c\u540c\u8fd9\u4e9b\u547d\u4ee4\u88ab\u6dfb\u52a0\u5230\u5217\u8868\u4e2d\u987a\u5e8f\u662f\u4e00\u81f4\u7684\u3002\u53d1\u5f80\u670d\u52a1\u5668\u7684\u547d\u4ee4\u5217\u8868\u4e2d\uff0c\u53ea\u8981\u6709\u4e00\u4e2a\u547d\u4ee4\u6267\u884c\u5931\u8d25\uff0cftp\u670d\u52a1\u5668\u5c31\u4f1a\u8fd4\u56de\u4e00\u4e2a\u9519\u8bef\u4ee3\u7801\uff0c\u6b64\u65f6libcurl\u5c06\u76f4\u63a5\u8fd4\u56deCURLE_QUOTE_ERROR\uff0c\u4e0d\u518d\u6267\u884c\u5269\u4f59\u7684FTP\u547d\u4ee4\u3002<\/p>\n<p>\u5c06CURLOPT_HEADER\u8bbe\u7f6e\u4e3a1\uff0clibcurl\u83b7\u53d6\u76ee\u6807\u6587\u4ef6\u7684\u4fe1\u606f\uff0c\u5e76\u4ee5HTTP\u6d88\u606f\u5934\u7684\u6837\u5f0f\u6765\u8f93\u51fa\u6d88\u606f\u5934\u3002<\/p>\n<h5>FTP\u81ea\u5b9a\u4e49CUSTOMREQUEST<\/h5>\n<p>\u4f7f\u7528CURLOPT_CUSTOMREQUEST\u5c5e\u6027\uff0c\u53ef\u4ee5\u5411FTP\u670d\u52a1\u5668\u53d1\u9001\u547d\u4ee4\u3002&#8221;NLST&#8221;\u662fftp\u9ed8\u8ba4\u7684\u5217\u51fa\u6587\u4ef6\u5217\u8868\u7684\u547d\u4ee4\u3002 \u4e0b\u9762\u7684\u4ee3\u7801\u7528\u4e8e\u5217\u51faFTP\u670d\u52a1\u5668\u4e0a\u7684\u6587\u4ef6\u5217\u8868\uff1a<\/p>\n<div>\n<pre>int main(int argc, char **argv)\r\n{\r\n\tcurl_global_init(CURL_GLOBAL_WIN32);\r\n\tCURL *easy_handle = curl_easy_init();\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_URL, \"<a href=\"ftp:\/\/127.0.0.1\/%22%29;curl_easy_setopt%28easy_handle\">ftp:\/\/127.0.0.1\/<\/a><a href=\"ftp:\/\/127.0.0.1\/%22%29;curl_easy_setopt%28easy_handle\">\");\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle<\/a>, CURLOPT_CUSTOMREQUEST, \"NLST\");<\/pre>\n<pre>\tcurl_easy_perform(easy_handle);\r\n\r\n\tcurl_easy_cleanup(easy_handle);\r\n\tcurl_global_cleanup();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<\/div>\n<h3>Cookies Without Chocolate Chips<\/h3>\n<p>cookie\u662f\u4e00\u4e2a\u952e\u503c\u5bf9\u7684\u96c6\u5408\uff0cHTTP\u670d\u52a1\u5668\u53d1\u7ed9\u5ba2\u6237\u7aef\u7684cookie\uff0c\u5ba2\u6237\u7aef\u63d0\u4ea4\u8bf7\u6c42\u7684\u65f6\u5019\uff0c\u4e5f\u4f1a\u5c06cookie\u53d1\u9001\u5230\u670d\u52a1\u5668\u3002\u670d\u52a1\u5668\u53ef\u4ee5\u6839\u636e cookie\u6765\u8ddf\u8e2a\u7528\u6237\u7684\u4f1a\u8bdd\u4fe1\u606f\u3002cookie\u6709\u8fc7\u671f\u65f6\u95f4\uff0c\u8d85\u65f6\u540ecookie\u5c31\u4f1a\u5931\u6548\u3002cookie\u6709\u57df\u540d\u548c\u8def\u5f84\u9650\u5236\uff0ccookie\u53ea\u80fd\u53d1\u7ed9\u6307\u5b9a\u57df\u540d \u548c\u8def\u5f84\u7684HTTP\u670d\u52a1\u5668\u3002<\/p>\n<p>cookie\u4ee5\u6d88\u606f\u5934\u201dSet-Cookie\u201d\u7684\u5f62\u5f0f\u4eceHTTP\u670d\u52a1\u5668\u53d1\u9001\u5230\u5ba2\u6237\u7aef\uff1b\u5ba2\u6237\u7aef\u53d1\u4ee5\u6d88\u606f\u5934\u201dCookie\u201d\u7684\u5f62\u5f0f\u5c06Cookie\u63d0\u4ea4\u5230 HTTP\u670d\u52a1\u5668\u3002\u4e3a\u4e86\u5bf9\u8fd9\u4e9b\u4e1c\u897f\u6709\u4e2a\u76f4\u89c2\u7684\u6982\u5ff5\uff0c\u4e0b\u56fe\u662fFireFox\u4e2d\uff0c\u4f7f\u7528Firebug\u8ddf\u8e2a\u5230\u7684cookie\u6d88\u606f\u5934\uff1a<br \/>\n<a href=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_4.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"pic1\" alt=\"pic1\" src=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_thumb_4.jpg\" width=\"631\" height=\"526\" border=\"0\" \/> <\/a><\/p>\n<p>\u5728libcurl\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7CURLOPT_COOKIE\u5c5e\u6027\u6765\u8bbe\u7f6e\u53d1\u5f80\u670d\u52a1\u5668\u7684cookie\uff1a<\/p>\n<div>\n<pre><strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_COOKIE, \"name1=var1; name2=var2;\");<\/pre>\n<\/div>\n<p>\u4e0b\u9762\u7684\u4f8b\u5b50\u6f14\u793a\u4e86\u5982\u4f55\u4f7f\u7528libcurl\u53d1\u9001cookie\u4fe1\u606f\u7ed9HTTP\u670d\u52a1\u5668\uff0c\u4ee3\u7801\u975e\u5e38\u7684\u7b80\u5355\uff1a<\/p>\n<div>\n<pre>int main(int argc, char **argv)\r\n{\r\n\tcurl_global_init(CURL_GLOBAL_WIN32);\r\n\tCURL *easy_handle = curl_easy_init();\r\n\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle, CURLOPT_URL, <a href=\"http:\/\/localhost:2210\/Default.aspx%29;curl_easy_setopt%28easy_handle\">http:\/\/localhost:2210\/Default.aspx<\/a><a href=\"http:\/\/localhost:2210\/Default.aspx%29;curl_easy_setopt%28easy_handle\">);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle<\/a>, CURLOPT_COOKIE, \"name=JGood; address=HangZhou\");\r\n\r\n\tcurl_easy_perform(easy_handle);\r\n\r\n\tcurl_easy_cleanup(easy_handle);\r\n\tcurl_global_cleanup();\r\n\r\n\treturn 0;\r\n}<\/pre>\n<\/div>\n<p>\u4e0b\u56fe\u662f\u5728ASP.NET Web\u670d\u52a1\u5668\u4e0a\u8c03\u8bd5\u65f6\u8ddf\u8e2a\u5230\u7684Cookie\u6570\u636e\uff1a<a href=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_5.jpg\"><img loading=\"lazy\" decoding=\"async\" title=\"pic1\" alt=\"pic1\" src=\"http:\/\/p.blog.csdn.net\/images\/p_blog_csdn_net\/JGood\/601714\/o_pic1_thumb_5.jpg\" width=\"554\" height=\"282\" border=\"0\" \/> <\/a><\/p>\n<p>\u5728\u5b9e\u5728\u7684\u5e94\u7528\u573a\u666f\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u4fdd\u5b58\u670d\u52a1\u5668\u53d1\u9001\u7ed9\u4f60\u7684cookie\uff0c\u5e76\u5728\u63a5\u4e0b\u6765\u7684\u8bf7\u6c42\u4e2d\uff0c\u628a\u8fd9\u4e9bcookie\u4e00\u5e76\u53d1\u5f80\u670d\u52a1\u5668\u3002\u6240\u4ee5\uff0c\u53ef\u4ee5\u628a\u4e0a\u6b21\u4ece\u670d\u52a1\u5668\u6536 \u5230\u7684\u6240\u6709\u54cd\u5e94\u5934\u4fe1\u606f\u4fdd\u5b58\u5230\u6587\u672c\u6587\u4ef6\u4e2d\uff0c\u5f53\u4e0b\u6b21\u9700\u8981\u5411\u670d\u52a1\u5668\u53d1\u9001\u8bf7\u6c42\u65f6\uff0c\u901a\u8fc7CURLOPT_COOKIEFILE\u5c5e\u6027\u544a\u8bc9libcurl\u4ece\u8be5\u6587\u4ef6\u4e2d\u8bfb\u53d6 cookie\u4fe1\u606f\u3002<br \/>\n\u8bbe\u7f6eCURLOPT_COOKIEFILE\u5c5e\u6027\u610f\u5473\u7740\u6fc0\u6d3blibcurl\u7684cookie parser\u3002\u5728cookie parser\u88ab\u6fc0\u6d3b\u4e4b\u524d\uff0clibcurl\u5ffd\u7565\u6240\u4ee5\u4e4b\u524d\u63a5\u6536\u5230\u7684cookie\u4fe1\u606f\u3002cookie parser\u88ab\u6fc0\u6d3b\u4e4b\u540e\uff0ccookie\u4fe1\u606f\u5c06\u88ab\u4fdd\u5b58\u5185\u5b58\u4e2d\uff0c\u5728\u63a5\u4e0b\u6765\u7684\u8bf7\u6c42\u4e2d\uff0clibcurl\u4f1a\u81ea\u52a8\u5c06\u8fd9\u4e9bcookie\u4fe1\u606f\u6dfb\u52a0\u5230\u6d88\u606f\u5934\u91cc\uff0c\u4f60\u7684\u5e94\u7528\u7a0b\u5e8f \u4e0d\u9700\u8981\u505a\u4efb\u4f55\u4e8b\u4ef6\u3002\u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u8fd9\u5df2\u7ecf\u8db3\u591f\u4e86\u3002\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u901a\u8fc7CURLOPT_COOKIEFILE\u5c5e\u6027\u6765\u6fc0\u6d3bcookie parser\uff0c\u7ed9CURLOPT_COOKIEFILE\u5c5e\u6027\u8bbe\u7f6e\u7684\u4e00\u4e2a\u4fdd\u5b58cookie\u4fe1\u606f\u7684\u6587\u672c\u6587\u4ef6\u8def\u5f84\uff0c\u53ef\u80fd\u5e76\u4e0d\u9700\u8981\u5728\u78c1\u76d8\u4e0a\u7269\u7406\u5b58\u5728\u3002<br \/>\n\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528NetScape\u6216\u8005FireFox\u6d4f\u89c8\u5668\u7684cookie\u6587\u4ef6\uff0c\u4f60\u53ea\u8981\u7528\u8fd9\u4e9b\u6d4f\u89c8\u5668\u7684cookie\u6587\u4ef6\u7684\u8def\u5f84\u6765\u521d\u59cb\u5316 CURLOPT_COOKIEFILE\u5c5e\u6027\uff0clibcurl\u4f1a\u81ea\u52a8\u5206\u6790cookie\u6587\u4ef6\uff0c\u5e76\u5728\u63a5\u4e0b\u6765\u7684\u8bf7\u6c42\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8fd9\u4e9bcookie\u4fe1\u606f\u3002<br \/>\nlibcurl\u751a\u81f3\u80fd\u591f\u628a\u63a5\u6536\u5230\u7684cookie\u4fe1\u606f\u4fdd\u5b58\u6210\u80fd\u88abNetscape\/Mozilla\u7684\u6d4f\u89c8\u5668\u6240\u8bc6\u522b\u7684cookie\u6587\u4ef6\u3002\u901a\u8fc7\u628a\u8fd9\u4e9b\u79f0\u4e3a cookie-jar\u3002\u901a\u8fc7\u8bbe\u7f6eCURLOPT_COOKIEJAR\u9009\u9879\uff0c\u5728\u8c03\u7528curl_easy_cleanup\u91ca\u653eeasy handle\u7684\u65f6\u5019\uff0c\u6240\u6709\u7684\u8fd9\u4e9bcookie\u4fe1\u606f\u90fd\u4f1a\u4fdd\u5b58\u5230cookie-jar\u6587\u4ef6\u4e2d\u3002\u8fd9\u5c31\u4f7f\u5f97cookie\u4fe1\u606f\u80fd\u5728\u4e0d\u540c\u7684easy handle\u751a\u81f3\u5728\u6d4f\u89c8\u5668\u4e4b\u95f4\u5b9e\u73b0\u5171\u4eab\u3002<\/p>\n<h3>FTP Peculiarities We Need<\/h3>\n<p>\u5728\u4f7f\u7528FTP\u534f\u8bae\u8fdb\u884c\u6570\u636e\u4f20\u8f93\u7684\u65f6\u5019\uff0c\u9700\u8981\u521b\u5efa\u4e24\u4e2a\u8fde\u63a5\u3002\u7b2c\u4e00\u4e2a\u8fde\u63a5\u7528\u4e8e\u4f20\u8f93\u63a7\u5236\u547d\u4ee4\uff0c\u53e6\u4e00\u4e2a\u8fde\u63a5\u7528\u4e8e\u4f20\u8f93\u6570\u636e\u3002\uff08\u5173\u4e8eFTP\u7684\u901a\u4fe1\u8fc7\u7a0b\uff0c\u8bf7\u53c2\u8003\u8fd9\u7bc7\u6587\u7ae0\uff1a<a href=\"http:\/\/www.wangjia.net\/bo-blog\/post\/698\/\">http:\/\/www.wangjia.net\/bo-blog\/post\/698\/\uff09\u3002<\/a> FTP\u901a\u4fe1\u9700\u8981\u521b\u5efa\u4e24\u4e2a\u8fde\u63a5\u8fd9\u4e2a\u4e8b\u5b9e\u5f80\u5f80\u88ab\u5f88\u591a\u4eba\u5ffd\u7565\u3002\u6839\u636e\u7b2c\u4e8c\u4e2a\u8fde\u63a5\u7684\u53d1\u8d77\u65b9\u662f\u8c01\uff0c\u53ef\u4ee5\u5206\u4e3a\u4e3b\u52a8\u6a21\u5f0f\u4e0e\u88ab\u52a8\u6a21\u5f0f\u3002libcurl\u5bf9\u6b64\u90fd\u63d0\u4f9b\u4e86\u652f\u6301\u3002 libcurl\u9ed8\u8ba4\u4f7f\u7528\u88ab\u52a8\u6a21\u5f0f\uff0c\u56e0\u4e3a\u88ab\u52a8\u6a21\u5f0f\u53ef\u4ee5\u65b9\u4fbf\u7684\u7a7f\u900f\u9632\u706b\u5899\uff0cNAT\u7b49\u95ee\u9898\u3002\u5728\u88ab\u52a8\u6a21\u5f0f\u4e0b\uff0clibcurl\u8981\u6c42ftp\u670d\u52a1\u5668\u6253\u5f00\u4e00\u4e2a\u65b0\u7684\u7aef\u53e3\u76d1 \u542c\uff0c\u7136\u540elibcurl\u8fde\u63a5\u8be5\u7aef\u53e3\u7528\u4e8e\u6570\u636e\u4f20\u8f93\u3002\u5982\u679c\u4f7f\u7528\u4e3b\u52a8\u6a21\u5f0f\uff0c\u7a0b\u5e8f\u5fc5\u987b\u544a\u8bc9FTP\u670d\u52a1\u5668\u4f60\u76d1\u542c\u7684IP\u4e0e\u7aef\u53e3\uff0c\u901a\u8fc7\u8bbe\u7f6e CURLOPT_FTPPORT\u5c5e\u6027\u6765\u5b8c\u6210\u3002<\/p>\n<h3>Headers Equal Fun<\/h3>\n<p>\uff08\u8fd9\u6bb5\u6587\u5b57\u6211\u7406\u89e3\u7684\u5f88\u6a21\u7cca\uff0c\u8bf7\u8bfb\u8005\u53c2\u8003\u539f\u6587\uff09\u6709\u4e9b\u534f\u8bae\u63d0\u4f9b\u72ec\u7acb\u4e8e\u6b63\u5e38\u6570\u636e\u7684 \u6d88\u606f\u5934\u3001meta-data\u3002\u6b63\u5e38\u7684\u6570\u636e\u6d41\u91cc\u901a\u5e38\u4e0d\u5305\u62ec \u4fe1\u606f\u5934\u548c\u5143\u6570\u636e\u3002\u53ef\u4ee5\u5c06CURLOPT_HEADER\u8bbe\u7f6e\u4e3a1\uff0c\u4f7f\u4fe1\u606f\u5934\u3001\u5143\u6570\u636e\u4e5f\u80fd\u51fa\u73b0\u5728\u6570\u636e\u6d41\u4e2d\u3002libcurl\u7684\u5f3a\u5927\u4e4b\u5904\u5728\u4e8e\uff0c\u5b83\u80fd\u591f\u4ece\u6570\u636e\u6d41\u4e2d\u89e3 \u6790\u51fa\u6d88\u606f\u5934\uff0c\u2026.<\/p>\n<h3>Post Transfer Information<\/h3>\n<p>[ curl_easy_getinfo ]<\/p>\n<h3>\u5b89\u5168\u8003\u8651<\/h3>\n<p>\u8bf7\u53c2\u8003\u539f\u6587\uff0c\u6b64\u5904\u7565\u3002<\/p>\n<h3>\u4f7f\u7528multi interface\u540c\u65f6\u8fdb\u884c\u591a\u9879\u4f20\u8f93<\/h3>\n<p>\u4e0a\u9762\u4ecb\u7ecd\u7684easy interface\u4ee5\u540c\u6b65\u7684\u65b9\u5f0f\u8fdb\u884c\u6570\u636e\u4f20\u8f93\uff0ccurl_easy_perform\u4f1a\u4e00\u76f4\u963b\u585e\u5230\u6570\u636e\u4f20\u8f93\u5b8c\u6bd5\u540e\u8fd4\u56de\uff0c\u4e14\u4e00\u6b21\u64cd\u4f5c\u53ea\u80fd\u53d1\u9001\u4e00\u6b21\u8bf7\u6c42\uff0c\u5982\u679c\u8981\u540c\u65f6\u53d1\u9001\u591a\u4e2a\u8bf7\u6c42\uff0c\u5fc5\u987b\u4f7f\u7528\u591a\u7ebf\u7a0b\u3002<br \/>\n\u800cmulti interface\u4ee5\u4e00\u79cd\u7b80\u5355\u7684\u3001\u975e\u963b\u585e\u7684\u65b9\u5f0f\u8fdb\u884c\u4f20\u8f93\uff0c\u5b83\u5141\u8bb8\u5728\u4e00\u4e2a\u7ebf\u7a0b\u4e2d\uff0c\u540c\u65f6\u63d0\u4ea4\u591a\u4e2a\u76f8\u540c\u7c7b\u578b\u7684\u8bf7\u6c42\u3002 \u5728\u4f7f\u7528multi interface\u4e4b\u524d\uff0c\u4f60\u5e94\u8be5\u638c\u63e1easy interface\u7684\u57fa\u672c\u4f7f\u7528\u3002\u56e0\u4e3amulti interface\u662f\u5efa\u7acb\u5728easy interface\u57fa\u7840\u4e4b\u4e0a\u7684\uff0c\u5b83\u53ea\u662f\u7b80\u5355\u7684\u5c06\u591a\u4e2aeasy handler\u6dfb\u52a0\u5230\u4e00\u4e2amulti stack\uff0c\u800c\u540e\u540c\u65f6\u4f20\u8f93\u800c\u5df2\u3002<br \/>\n\u4f7f\u7528multi interface\u5f88\u7b80\u5355\uff0c\u9996\u5148\u4f7f\u7528curl_multi_init()\u51fd\u6570\u521b\u5efa\u4e00\u4e2amulti handler\uff0c\u7136\u540e\u4f7f\u7528curl_easy_init()\u521b\u5efa\u4e00\u4e2a\u6216\u591a\u4e2aeasy handler\uff0c\u5e76\u6309\u7167\u4e0a\u9762\u51e0\u7ae0\u4ecb\u7ecd\u7684\u63a5\u53e3\u6b63\u5e38\u7684\u8bbe\u7f6e\u76f8\u5173\u7684\u5c5e\u6027\uff0c\u7136\u540e\u901a\u8fc7curl_multi_add_handler\u5c06\u8fd9\u4e9beasy handler\u6dfb\u52a0\u5230multi handler\uff0c\u6700\u540e\u8c03\u7528curl_multi_perform\u8fdb\u884c\u6570\u636e\u4f20\u8f93\u3002<br \/>\ncurl_multi_perform\u662f\u5f02\u6b65\u7684\u3001\u975e\u963b\u585e\u7684\u51fd\u6570\u3002\u5982\u679c\u5b83\u8fd4\u56deCURLM_CALL_MULTI_PERFORM\uff0c\u8868\u793a\u6570\u636e\u901a\u4fe1\u6b63\u5728\u8fdb\u884c\u3002<\/p>\n<p>\u901a\u8fc7select()\u6765\u64cd\u4f5cmulti interface\u5c06\u4f1a\u4f7f\u5de5\u4f5c\u53d8\u5f97\u7b80\u5355\uff08\u8bd1\u8005\u6ce8\uff1a\u5176\u5b9e\u6bcf\u4e2aeasy handler\u5728\u4f4e\u5c42\u5c31\u662f\u4e00\u4e2asocket\uff0c\u901a\u8fc7select()\u6765\u7ba1\u7406\u8fd9\u4e9bsocket\uff0c\u5728\u6709\u6570\u636e\u53ef\u8bfb\/\u53ef\u5199\/\u5f02\u5e38\u7684\u65f6\u5019\uff0c\u901a\u77e5\u5e94\u7528\u7a0b\u5e8f\uff09\u3002\u5728\u8c03\u7528 select()\u51fd\u6570\u4e4b\u524d\uff0c\u5e94\u8be5\u4f7f\u7528curl_multi_fdset\u6765\u521d\u59cb\u5316fd_set\u53d8\u91cf\u3002<\/p>\n<p>select()\u51fd\u6570\u8fd4\u56de\u65f6\uff0c\u8bf4\u660e\u53d7\u7ba1\u7406\u7684\u4f4e\u5c42socket\u53ef\u4ee5\u64cd\u4f5c\u76f8\u5e94\u7684\u64cd\u4f5c\uff08\u63a5\u6536\u6570\u636e\u6216\u53d1\u9001\u6570\u636e\uff0c\u6216\u8005\u8fde\u63a5\u5df2\u7ecf\u65ad\u5f00\uff09\uff0c\u6b64\u65f6\u5e94\u8be5\u9a6c\u4e0a\u8c03\u7528 curl_multi_perform\uff0clibcurl\u5c06\u4f1a\u6267\u884c\u76f8\u5e94\u64cd\u4f5c\u3002\u4f7f\u7528select()\u65f6\uff0c\u5e94\u8be5\u8bbe\u7f6e\u4e00\u4e2a\u8f83\u77ed\u7684\u8d85\u65f6\u65f6\u95f4\u3002\u5728\u8c03\u7528select() \u4e4b\u524d\uff0c\u9020\u6210\u4e0d\u8981\u5fd8\u8bb0\u901a\u8fc7curl_multi_fdset\u6765\u521d\u59cb\u5316fd_set\uff0c\u56e0\u4e3a\u6bcf\u6b21\u64cd\u4f5c\uff0cfd_set\u4e2d\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u53ef\u80fd\u90fd\u4e0d\u4e00\u6837\u3002<\/p>\n<p>\u5982\u679c\u4f60\u60f3\u4e2d\u6b62multi stack\u4e2d\u67d0\u4e00\u4e2aeasy handle\u7684\u6570\u636e\u901a\u4fe1\uff0c\u53ef\u4ee5\u8c03\u7528curl_multi_remove_handle\u51fd\u6570\u5c06\u5176\u4ecemulti stack\u4e2d\u53d6\u51fa\u3002\u5343\u4e07\u53e6\u5fd8\u8bb0\u91ca\u653e\u6389easy handle\uff08\u901a\u8fc7curl_easy_cleanup()\u51fd\u6570\uff09\u3002<\/p>\n<p>\u5f53multi stack\u4e2d\u7684\u4e00\u4e2aeash handle\u5b8c\u6210\u6570\u636e\u4f20\u8f93\u7684\u65f6\u5019\uff0c\u540c\u65f6\u8fd0\u884c\u7684\u4f20\u8f93\u4efb\u52a1\u6570\u91cf\u5c31\u4f1a\u51cf\u5c11\u4e00\u4e2a\u3002\u5f53\u6570\u91cf\u964d\u52300\u7684\u65f6\u5019\uff0c\u8bf4\u660e\u6240\u6709\u7684\u6570\u636e\u4f20\u8f93\u5df2\u7ecf\u5b8c\u6210\u3002<\/p>\n<p>curl_multi_info_read\u7528\u4e8e\u83b7\u53d6\u5f53\u524d\u5df2\u7ecf\u5b8c\u6210\u7684\u4f20\u8f93\u4efb\u52a1\u4fe1\u606f\uff0c\u5b83\u8fd4\u56de\u6bcf\u4e00\u4e2aeasy handle\u7684CURLcode\u72b6\u6001\u7801\u3002\u53ef\u4ee5\u6839\u636e\u8fd9\u4e2a\u72b6\u6001\u7801\u6765\u5224\u65ad\u6bcf\u4e2aeasy handle\u4f20\u8f93\u662f\u5426\u6210\u529f\u3002<\/p>\n<p>\u4e0b\u9762\u7684\u4f8b\u5b50\uff0c\u6f14\u793a\u4e86\u5982\u4f55\u4f7f\u7528multi interface\u8fdb\u884c\u7f51\u9875\u6293\u53d6\uff1a<\/p>\n<div>\n<pre>int main(int argc, char **argv)\r\n{\r\n\t\/\/ \u521d\u59cb\u5316\r\n\tcurl_global_init(CURL_GLOBAL_WIN32);\r\n\tCURLM *multi_handle = NULL;\r\n\tCURL *easy_handle1 = NULL;\r\n\tCURL *easy_handle2 = NULL;\r\n\r\n\textern size_t save_sina_page(void *buffer, size_t size, size_t count, void *user_p);\r\n\textern size_t save_sohu_page(void *buffer, size_t size, size_t count, void *user_p);\r\n\tFILE *fp_sina = fopen(\"sina.html\", \"ab+\");\r\n\tFILE *fp_sohu = fopen(\"sohu.html\", \"ab+\");\r\n\r\n\tmulti_handle = curl_multi_init();\r\n\r\n\t\/\/ \u8bbe\u7f6eeasy handle\r\n\teasy_handle1 = curl_easy_init();\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle1, CURLOPT_URL, \"http:\/\/www.sina.com.cn\");\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle1, CURLOPT_WRITEFUNCTION, &amp;save_sina_page);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle1, CURLOPT_WRITEDATA, fp_sina);\r\n\r\n\teasy_handle2 = curl_easy_init();\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle2, CURLOPT_URL, \"http:\/\/www.sohu.com\");\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle2, CURLOPT_WRITEFUNCTION, &amp;save_sohu_page);\r\n\t<strong>curl_easy_setopt<\/strong>(easy_handle2, CURLOPT_WRITEDATA, fp_sohu);\r\n\r\n\t\/\/ \u6dfb\u52a0\u5230multi stack\r\n\tcurl_multi_add_handle(multi_handle, easy_handle1);\r\n\tcurl_multi_add_handle(multi_handle, easy_handle2);\r\n\r\n\t\/\/ \r\n\tint running_handle_count;\r\n\twhile (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &amp;running_handle_count))\r\n\t{\r\n\t\tcout &lt;&lt; running_handle_count &lt;&lt; endl;\r\n\t}\r\n\r\n\twhile (running_handle_count)\r\n\t{\r\n\t\ttimeval tv;\r\n\t\ttv.tv_sec = 1;\r\n\t\ttv.tv_usec = 0;\r\n\r\n\t\tint max_fd;\r\n\t\tfd_set fd_read;\r\n\t\tfd_set fd_write;\r\n\t\tfd_set fd_except;\r\n\r\n\t\tFD_ZERO(&amp;fd_read);\r\n\t\tFD_ZERO(&amp;fd_write);\r\n\t\tFD_ZERO(&amp;fd_except);\r\n\r\n\t\tcurl_multi_fdset(multi_handle, &amp;fd_read, &amp;fd_write, &amp;fd_except, &amp;max_fd);\r\n\t\tint return_code = select(max_fd + 1, &amp;fd_read, &amp;fd_write, &amp;fd_except, &amp;tv);\r\n\t\tif (SOCKET_ERROR == return_code)\r\n\t\t{\r\n\t\t\tcerr &lt;&lt; \"select error.\" &lt;&lt; endl;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\twhile (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &amp;running_handle_count))\r\n\t\t\t{\r\n\t\t\t\tcout &lt;&lt; running_handle_count &lt;&lt; endl;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t\/\/ \u91ca\u653e\u8d44\u6e90\r\n\tfclose(fp_sina);\r\n\tfclose(fp_sohu);\r\n\tcurl_easy_cleanup(easy_handle1);\r\n\tcurl_easy_cleanup(easy_handle2);\r\n\tcurl_multi_cleanup(multi_handle);\r\n\tcurl_global_cleanup();\r\n\r\n\treturn 0;\r\n}\r\n\r\nsize_t save_sina_page(void *buffer, size_t size, size_t count, void *user_p)\r\n{\r\n\treturn fwrite(buffer, size, count, (FILE *)user_p);\r\n}\r\n\r\nsize_t save_sohu_page(void *buffer, size_t size, size_t count, void *user_p)\r\n{\r\n\treturn fwrite(buffer, size, count, (FILE *)user_p);\r\n}<\/pre>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>curl\u662fLinux\u4e0b\u4e00\u4e2a\u975e\u5e38\u8457\u540d\u7684\u4e0b\u8f7d\u5e93\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5e93\uff0c\u53ef\u4ee5\u5f88\u7b80\u5355\u7684\u5b9e\u73b0\u6587\u4ef6\u7684\u4e0b &#8230; <a class=\"more-link\" href=\"https:\/\/actom.me\/blog\/linux-c-libcurl%e7%9a%84%e7%ae%80%e5%8d%95%e4%bd%bf%e7%94%a8.html\">Read More &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/643"}],"collection":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/comments?post=643"}],"version-history":[{"count":3,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/643\/revisions"}],"predecessor-version":[{"id":928,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/posts\/643\/revisions\/928"}],"wp:attachment":[{"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/media?parent=643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/categories?post=643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actom.me\/blog\/wp-json\/wp\/v2\/tags?post=643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}