首页 > 代码库 > c语言libcurl 使用实例get/post方法+c语言字符串处理

c语言libcurl 使用实例get/post方法+c语言字符串处理

[cpp] view plaincopy技术分享技术分享
 
  1. #include <stdio.h>  
  2. #include <curl/curl.h>  
  3. #include <string.h>  
  4. #include <ctype.h>  
  5. #include <iconv.h>  
  6. #define TMP_FILE "tmp.html"  
  7. #define HTML_BUFFER_SIZE 1024*800  
  8.   
  9. void split(char **arr, char *str, const char *del) {  
  10.     char *s = strtok(str, del);  
  11.     while (s != NULL) {  
  12.         *arr++ = s;  
  13.         s = strtok(NULL, del);  
  14.     }  
  15. }  
  16.   
  17. /*将str1字符串中第一次出现的str2字符串替换成str3*/  
  18. void replaceFirst(char *str1, char *str2, char *str3) {  
  19.     char str4[strlen(str1) + 1];  
  20.     char *p;  
  21.     strcpy(str4, str1);  
  22.     if ((p = strstr(str1, str2)) != NULL)/*p指向str2在str1中第一次出现的位置*/ {  
  23.         while (str1 != p && str1 != NULL)/*将str1指针移动到p的位置*/ {  
  24.             str1++;  
  25.         }  
  26.         str1[0] = ‘/0‘; /*将str1指针指向的值变成/0,以此来截断str1,舍弃str2及以后的内容,只保留str2以前的内容*/  
  27.         strcat(str1, str3); /*在str1后拼接上str3,组成新str1*/  
  28.         strcat(str1, strstr(str4, str2) + strlen(str2)); /*strstr(str4,str2)是指向str2及以后的内容(包括str2),strstr(str4,str2)+strlen(str2)就是将指针向前移动strlen(str2)位,跳过str2*/  
  29.     }  
  30. }  
  31.   
  32. /*将str1出现的所有的str2都替换为str3*/  
  33. void replace(char *str1, char *str2, char *str3) {  
  34.     while (strstr(str1, str2) != NULL) {  
  35.         replaceFirst(str1, str2, str3);  
  36.     }  
  37. }  
  38.   
  39. /*截取src字符串中,从下标为start开始到end-1(end前面)的字符串保存在dest中(下标从0开始)*/  
  40. void substring(char *dest, char *src, int start, int end) {  
  41.     char *p = src;  
  42.     int i = start;  
  43.     if (start > strlen(src))return;  
  44.     if (end > strlen(src))  
  45.         end = strlen(src);  
  46.     while (i < end) {  
  47.         dest[i - start] = src[i];  
  48.         i++;  
  49.     }  
  50.     dest[i - start] = ‘/0‘;  
  51.     return;  
  52. }  
  53.   
  54. /*返回src中下标为index的字符*/  
  55. char charAt(char *src, int index) {  
  56.     char *p = src;  
  57.     int i = 0;  
  58.     if (index < 0 || index > strlen(src))  
  59.         return 0;  
  60.     while (i < index)i++;  
  61.     return p[i];  
  62. }  
  63.   
  64. /*返回str2第一次出现在str1中的位置(下表索引),不存在返回-1*/  
  65. int indexOf(char *str1, char *str2) {  
  66.     char *p = str1;  
  67.     int i = 0;  
  68.     p = strstr(str1, str2);  
  69.     if (p == NULL)  
  70.         return -1;  
  71.     else {  
  72.         while (str1 != p) {  
  73.             str1++;  
  74.             i++;  
  75.         }  
  76.     }  
  77.     return i;  
  78. }  
  79.   
  80. /*返回str1中最后一次出现str2的位置(下标),不存在返回-1*/  
  81. int lastIndexOf(char *str1, char *str2) {  
  82.     char *p = str1;  
  83.     int i = 0, len = strlen(str2);  
  84.     p = strstr(str1, str2);  
  85.     if (p == NULL)return -1;  
  86.     while (p != NULL) {  
  87.         for (; str1 != p; str1++)i++;  
  88.         p = p + len;  
  89.         p = strstr(p, str2);  
  90.     }  
  91.     return i;  
  92. }  
  93.   
  94. /*删除str左边第一个非空白字符前面的空白字符(空格符和横向制表符)*/  
  95. void ltrim(char *str) {  
  96.     int i = 0, j, len = strlen(str);  
  97.     while (str[i] != ‘/0‘) {  
  98.         if (str[i] != 32 && str[i] != 9)break; /*32:空格,9:横向制表符*/  
  99.         i++;  
  100.     }  
  101.     if (i != 0)  
  102.         for (j = 0; j <= len - i; j++) {  
  103.             str[j] = str[j + i]; /*将后面的字符顺势前移,补充删掉的空白位置*/  
  104.         }  
  105. }  
  106.   
  107. /*删除str最后一个非空白字符后面的所有空白字符(空格符和横向制表符)*/  
  108. void rtrim(char *str) {  
  109.     char *p = str;  
  110.     int i = strlen(str) - 1;  
  111.     while (i >= 0) {  
  112.         if (p[i] != 32 && p[i] != 9)break;  
  113.         i--;  
  114.     }  
  115.     str[++i] = ‘/0‘;  
  116. }  
  117.   
  118. /*删除str两端的空白字符*/  
  119. void trim(char *str) {  
  120.     ltrim(str);  
  121.     rtrim(str);  
  122. }  
  123.   
  124. //这是libcurl接收数据的回调函数,相当于recv的死循环  
  125. //其中stream可以自定义数据类型,这里我传入的是文件保存路径  
  126.   
  127. static size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {  
  128.     int len = size * nmemb;  
  129.     int written = len;  
  130.     FILE *fp = NULL;  
  131.     if (access((char*) stream, 0) == -1) {  
  132.         fp = fopen((char*) stream, "wb");  
  133.     } else {  
  134.         fp = fopen((char*) stream, "ab");  
  135.     }  
  136.     if (fp) {  
  137.         fwrite(ptr, size, nmemb, fp);  
  138.     }  
  139.     // printf("%s\n",ptr);  
  140.     fclose(fp);  
  141.     return written;  
  142. }  
  143. //加上-lcurl库  
  144.   
  145. void test_post(char* url,char* data) {  
  146.     CURL *curl;  
  147.     CURLcode res;  
  148.     curl = curl_easy_init();  
  149.     if (curl) {  
  150.         //www.baidu.com/#wd=java  
  151.         curl_easy_setopt(curl, CURLOPT_URL, url);  
  152.         curl_easy_setopt(curl, CURLOPT_POST, 1L);  
  153.         curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);  
  154.         res = curl_easy_perform(curl);  
  155.         curl_easy_cleanup(curl);  
  156.     }  
  157. }  
  158.   
  159. int file_exists(char *filename) {  
  160.     return (access(filename, 0) == 0);  
  161. }  
  162. int GetCharset(char *src_html,char *charCode) {  
  163.     char tmp_html[HTML_BUFFER_SIZE]={0};  
  164.     int pos = indexOf(src_html, "text/html; charset=");  
  165.     if (pos > 0) {  
  166.         strncpy(tmp_html, src_html + pos + strlen("text/html; charset="), strlen(src_html) - pos);  
  167.         pos = indexOf(tmp_html, "\"");  
  168.         if (pos > 0) {  
  169.             strncpy(charCode, tmp_html, pos);  
  170.         }  
  171.     }  
  172.     return 0;  
  173.   
  174. }  
  175.   
  176. void test_get(char* url) {  
  177.     CURL *curl;  
  178.     CURLcode res;  
  179.     curl = curl_easy_init();  
  180.     if (curl) {  
  181.         if (file_exists(TMP_FILE))  
  182.             remove(TMP_FILE);  
  183.         curl_easy_setopt(curl, CURLOPT_URL, url);  
  184.         //指定回调函数  
  185.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);  
  186.         //这个变量可作为接收或传递数据的作用  
  187.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, TMP_FILE);  
  188.         res = curl_easy_perform(curl);  
  189.         char tocode[64] = "UTF-8";  
  190.         if (CURLE_OK == res) {  
  191.             char *ct;  
  192.             res = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);  
  193.             if ((CURLE_OK == res) && ct)  
  194.                 printf("We received Content-Type: %s\n", ct);  
  195.             //printf("====\n");  
  196.             //int pos=strcspn(ct,"UTF-8");   
  197.             int index = indexOf(ct, "=");  
  198.             char* arr[3];  
  199.             if (index > 0) {  
  200.                 split(arr, ct, "=");  
  201.                 //printf("%s\n", arr[1]);  
  202.                 strcpy(tocode, arr[1]);  
  203.             }  
  204.             FILE *fp = NULL;  
  205.             fp = fopen(TMP_FILE, "r");  
  206.             char src_html[HTML_BUFFER_SIZE]={0};  
  207.             char output_html[HTML_BUFFER_SIZE]={0};  
  208.             char tmp_html[HTML_BUFFER_SIZE]={0};  
  209.             if (fp) {  
  210.                 fread(src_html, HTML_BUFFER_SIZE, 1, fp);     
  211.                 strcpy(tmp_html,src_html);  
  212.                 if(index <0) {  
  213.                     GetCharset(tmp_html,tocode);  
  214.                     printf("%s\n",tocode);  
  215.                 }  
  216.                 int iRet;  
  217.                 //打开字符集转换    
  218.                 iconv_t hIconv = iconv_open(tocode,"iso-8859-1");  
  219.                 if (-1 == (int) hIconv) {  
  220.                     return -1; //打开失败,可能不支持的字符集    
  221.                 }       
  222.                 printf("%s\n",src_html);  
  223.                 //开始转换    
  224.                 iRet = iconv(hIconv, (char**) (&src_html), strlen(src_html), (char**) (&output_html), strlen(src_html));                  
  225.                 printf("%s\n", output_html);    
  226.                 printf("ok");  
  227.                 if(strcmp(output_html,"")==0)  
  228.                 {  
  229.                      printf("%s\n",src_html);  
  230.                 }  
  231.                 //关闭字符集转换    
  232.                 iconv_close(hIconv);  
  233.                    
  234.             }  
  235.   
  236.         }  
  237.         curl_easy_cleanup(curl);  
  238.     }  
  239. }  
  240.   
  241. int main(int argc, char* argv) {  
  242.     //printf("%s\n",argv[1]);  
  243.     //http://192.168.1.6:8080/TestServer/index.html?fdasf=123456&af=89  
  244.     test_post("http://192.168.1.6:8080/TestServer/index.html","wd=hava&hehe=123456");  
  245.     //test_get("http://www.baidu.com/");  
  246.     printf("\nok");  
  247.     return 0;  
  248. }  

c语言libcurl 使用实例get/post方法+c语言字符串处理