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


    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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 ",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 ", ct);  
    195.             //printf("==== ");  
    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 ", 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 ",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 ",src_html);  
    223.                 //开始转换    
    224.                 iRet = iconv(hIconv, (char**) (&src_html), strlen(src_html), (char**) (&output_html), strlen(src_html));                  
    225.                 printf("%s ", output_html);    
    226.                 printf("ok");  
    227.                 if(strcmp(output_html,"")==0)  
    228.                 {  
    229.                      printf("%s ",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 ",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(" ok");  
    247.     return 0;  
    248. }  
  • 相关阅读:
    Asp.net MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合 前端javascript数组,后端接受
    jquery each循环遍历完再执行的方法 因为each是异步的 所以要加计数器.
    分布式中的一些概念,分布式简单理解,分布式架构的常见概念
    href="#"与href="javascript:void(0)"的区别
    Newtonsoft.Json高级用法DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET即Newtonsoft.Json datatable,dataset,modle,序列化
    Newtonsoft.Json高级用法,json序列号,model反序列化,支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity,字符串
    C#利用反射实现两个类的对象之间相同属性的值的复制,一个对象的属性复制给另一个对性的属性
    指定文件兼容性模式 < meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" />的意义
    使用 IIS 在 Windows 上托管 ASP.NET Core2.0
    jQuery.data() 的实现方式,jQuery16018518865841457738的由来,jQuery后边一串数字的由来
  • 原文地址:https://www.cnblogs.com/lidabo/p/4177016.html
Copyright © 2020-2023  润新知