curl支持HTTP和https

设计流程

基于curl工具实现https/http,设计初步流程为:linux平台验证→→交叉移植arm板。html

 

linux系统下调试http和https

1.1 Linux安装curl

输入命令:sudo apt-get install libcurl4-openssl-devlinux

安装头文件目录:/usr/include/curl/json

 

1.2 Linux系统应用软件编写和编译

主要初始化代码:api

 1 #include <stdio.h>  
 2 #include <stdlib.h>  
 3 #include <unistd.h>  
 4 #include <string.h>   
 5 #include "curl/curl.h"  
 6 
 7 #define false 0
 8 #define true  1
 9 //#define POSTURL "http://www.xiami.com/member/login"  10 //#define POSTURL "http://172.16.1.178:8000/api/pushOBEData" 
 11 #define POSTURL   "https://172.16.1.178:444/api/pushOBEData" 
 12 #define POSTFIELDS "email=myemail@163.com&password=mypassword&autologin=1&submit=登 录&type=" 
 13 size_t process_data(void *buffer, size_t size, size_t nmemb, void *user_p)  14 {  15     char bufR[1024];  16     char msg[1024];  17     size_t return_size = 0;  18 
 19     return_size = fwrite(buffer,size, nmemb, user_p);  20  fflush(user_p);  21     printf("%s>%d-%s\n", __func__, return_size, buffer);  22     return (size*nmemb);  23 }  24 
 25 int main(int argc, char **argv)  26 {  27     // 初始化libcurl
 28  CURLcode return_code;  29     char *pCaPath = NULL;  30     
 31     return_code = curl_global_init(CURL_GLOBAL_ALL);  32     if (CURLE_OK != return_code)  33  {  34         printf("init libcurl failed.\n");  35         return -1;  36  }  37    
 38     // 获取easy handle
 39     CURL *easy_handle = curl_easy_init();  40     if (NULL == easy_handle)  41  {  42         printf("get a easy handle failed.\n");  43         return -1;  44  }  45 
 46     struct curl_slist* headers = NULL;      //定义Curl的头部结构体  47           
 48     //---------------------给curl要发送的报文添加头部---------------------- 
 49     headers = curl_slist_append(headers, "Accept:application/json");            //表示本地cURL接受报文为json 
 50     headers = curl_slist_append(headers, "Content-Type:application/json");      //请求咱们发送的报文为json,注意这里必定要说明本身发送的信息为JSON类型的,不然对方使用的应用层函数可能没法正确的识别解析  51 // headers = curl_slist_append(headers, "charset:utf-8"); //表示咱们发送的报文的编码格式为utf-8类型的格式  52     //--------------------------------------------------------------------- 
 53           
 54     curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, headers);            //给cURL结构体添加咱们刚刚组成好的头部 
 55     FILE *fp ;  56 
 57     if(!(fp = fopen("data.html", "ab+")))  58  {  59         printf("fopen erro\n");  60         return -1;  61  }  62     fseek(fp, 0 , SEEK_SET);  63     // 设置easy handle属性
 64  curl_easy_setopt(easy_handle, CURLOPT_URL, POSTURL);  65     //curl_easy_setopt(easy_handle,CURLOPT_POSTFIELDS,POSTFIELDS); //post参数 
 66     curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data);  67  curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, fp);  68     curl_easy_setopt(easy_handle,CURLOPT_POST,1); //设置问非0表示本次操做为post  69     //curl_easy_setopt(easy_handle,CURLOPT_VERBOSE,1); //打印调试信息  70 // curl_easy_setopt(easy_handle, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环  71 // curl_easy_setopt(easy_handle,CURLOPT_HEADER,1); //将响应头信息和相应体一块儿传给write_data  72 // curl_easy_setopt(easy_handle,CURLOPT_FOLLOWLOCATION,1); //设置为非0,响应头信息location  73 // curl_easy_setopt(easy_handle,CURLOPT_COOKIEFILE,"curlposttest.txt"); 
 74     
 75     if(NULL == pCaPath)  76  {  77         curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYPEER, 0);//设定为不验证证书和HOST 
 78         curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYHOST, 0);  79  }  80     else 
 81  {  82         curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYPEER, 1);  83  curl_easy_setopt(easy_handle, CURLOPT_CAINFO, pCaPath);  84  }  85     
 86     // 执行数据请求
 87     printf("hello https---------------\n");  88     while(1)  89  {  90         char testbuf[100];  91         static testCnn = 0;  92         
 93         testCnn++;  94         snprintf(testbuf,sizeof(testbuf), "test cnn = %d", testCnn);  95         curl_easy_setopt(easy_handle,CURLOPT_POSTFIELDS,testbuf); //post参数 
 96         return_code = curl_easy_perform(easy_handle);  97         if (return_code != CURLE_OK)  98  {  99             switch(return_code) 100  { 101                 case CURLE_UNSUPPORTED_PROTOCOL: 102                     fprintf(stderr,"不支持的协议,由URL的头部指定\n"); 103                 case CURLE_COULDNT_CONNECT: 104                     fprintf(stderr,"不能链接到remote主机或者代理\n"); 105                 case CURLE_HTTP_RETURNED_ERROR: 106                     fprintf(stderr,"http返回错误\n"); 107                 case CURLE_READ_ERROR: 108                     fprintf(stderr,"读本地文件错误\n"); 109                 default: 110                     fprintf(stderr,"返回值:%d\n",return_code); 111  } 112             return -1; 113  } 114         sleep(10); 115  } 116     // 释放资源
117     sleep(10); 118  fclose(fp); 119  curl_easy_cleanup(easy_handle); 120  curl_global_cleanup(); 121 
122 
123     return 0; 124 }
View Code

 

 

gcc -o curlTest curlTest.c -l curlapp

2 ARM板上curl的移植

由于要支持https须要移植openssl 和 curlcurl

其中要注意只有在curl加入openssl才能支持https。ide

2.1 Openssl移植

开发环境函数

  Ubuntu 14.04 
  gcc-linaro-arm-linux-gnueabihf-4.9-2014.07工具

移植步骤post

1.从OpenSSL官网下载最新源码 openssl-1.0.2l.tar.gz。 
2.执行下面命名解压缩:tar zxvf openssl-1.0.2l.tar.gz

3.进入刚解压的目录cd openssl-1.0.2l/,执行下面指令,作相应的配置:

./config no-asm shared --prefix=/usr/local/ssl --cross-compile-prefix=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-

no-asm: 是在交叉编译过程当中不使用汇编代码代码加速编译过程,缘由是它的汇编代码是对arm格式不支持的。

shared :生成动态链接库。

--prefix :指定make install后生成目录的路径,不修改此项则默认为OPENSSLDIR目录(/usr/local/ssl)。

4.修改Makefile:

CC=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-gcc (此处交叉工具链用绝对路径)

删除 CFLAG= 中的-m64

AR=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-ar $(ARFLAGS) r

RANLIB=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-ranlib

NM=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-nm

SHARED_LDFLAGS=

注:上面各项都是修改后的,没有增长内容,只是在原来基础上作修改,故没有列出修改前的内容。

5.执行下面命令,编译OpenSSL库:

make

6.执行下面命令,将编译好的库文件拷贝到指定目录:

make install

7.include下文件在编译程序的时候须要指定include的路径。而lib下在程序运行时会用到,须要将lib下文件拷贝到开发板中。

 

2.2 curl在ARM中交叉移植

开发环境

  Ubuntu 14.04 
  gcc-linaro-arm-linux-gnueabihf-4.9-2014.07

         curl-7.59.0.tar.gz

移植步骤

1.下载最新源码 curl-7.59.0.tar.gz。 
2.执行下面命名解压缩:tar zxvf curl-7.59.0.tar.gz

3.进入刚解压的目录cd curl-7.59.0/,执行下面指令,作相应的配置:

./configure --prefix=/home/huali/usrApp/libcurl/ --with-ssl=/usr/local/ssl --host=arm-linux CC=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-gcc CXX=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin/arm-linux-gnueabihf-g++

--with-ssl:检测ssl 库所在位置

4.执行下面命令:

 make

5.执行下面命令,将编译好的库文件拷贝到指定目录:

    

 make install

6. 而后咱们把libcurl整个文件夹拷贝到板子上

7. 修改环境变量

这里我修改了/etc/profile文件,目的是使修改对全部用户生效,不用每次都修改了。咱们在第二行的PATH语句末尾添加“:/lib/bin”就能够了,而后保存退出。输入sync语句同步文件,而后重启便可。

8. 能够看到咱们成功安装curl

   

2.3.CMAKE编译

  Cmake编译教程这里再也不描述。

  cmake .

  make

  

  在arm板中运行curlTest执行文件便可。

  

相关文章
相关标签/搜索