设计流程

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

linux系统下调试http和https

1.1 Linux安装curl

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

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

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

主要初始化代码:

 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "curl/curl.h" #define false 0
#define true 1
//#define POSTURL "http://www.xiami.com/member/login"
//#define POSTURL "http://172.16.1.178:8000/api/pushOBEData"
#define POSTURL "https://172.16.1.178:444/api/pushOBEData"
#define POSTFIELDS "email=myemail@163.com&password=mypassword&autologin=1&submit=登 录&type="
size_t process_data(void *buffer, size_t size, size_t nmemb, void *user_p)
{
char bufR[];
char msg[];
size_t return_size = ; return_size = fwrite(buffer,size, nmemb, user_p);
fflush(user_p);
printf("%s>%d-%s\n", __func__, return_size, buffer);
return (size*nmemb);
} int main(int argc, char **argv)
{
// 初始化libcurl
CURLcode return_code;
char *pCaPath = NULL; return_code = curl_global_init(CURL_GLOBAL_ALL);
if (CURLE_OK != return_code)
{
printf("init libcurl failed.\n");
return -;
} // 获取easy handle
CURL *easy_handle = curl_easy_init();
if (NULL == easy_handle)
{
printf("get a easy handle failed.\n");
return -;
} struct curl_slist* headers = NULL; //定义Curl的头部结构体 //---------------------给curl要发送的报文添加头部----------------------
headers = curl_slist_append(headers, "Accept:application/json"); //表示本地cURL接受报文为json
headers = curl_slist_append(headers, "Content-Type:application/json"); //请求我们发送的报文为json,注意这里一定要说明自己发送的信息为JSON类型的,否则对方使用的应用层函数可能无法正确的识别解析
// headers = curl_slist_append(headers, "charset:utf-8"); //表示我们发送的报文的编码格式为utf-8类型的格式
//--------------------------------------------------------------------- curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, headers); //给cURL结构体添加我们刚刚组成好的头部
FILE *fp ; if(!(fp = fopen("data.html", "ab+")))
{
printf("fopen erro\n");
return -;
}
fseek(fp, , SEEK_SET);
// 设置easy handle属性
curl_easy_setopt(easy_handle, CURLOPT_URL, POSTURL);
//curl_easy_setopt(easy_handle,CURLOPT_POSTFIELDS,POSTFIELDS); //post参数
curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data);
curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, fp);
curl_easy_setopt(easy_handle,CURLOPT_POST,); //设置问非0表示本次操作为post
//curl_easy_setopt(easy_handle,CURLOPT_VERBOSE,1); //打印调试信息
// curl_easy_setopt(easy_handle, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
// curl_easy_setopt(easy_handle,CURLOPT_HEADER,1); //将响应头信息和相应体一起传给write_data
// curl_easy_setopt(easy_handle,CURLOPT_FOLLOWLOCATION,1); //设置为非0,响应头信息location
// curl_easy_setopt(easy_handle,CURLOPT_COOKIEFILE,"curlposttest.txt"); if(NULL == pCaPath)
{
curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYPEER, );//设定为不验证证书和HOST
curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYHOST, );
}
else
{
curl_easy_setopt(easy_handle, CURLOPT_SSL_VERIFYPEER, );
curl_easy_setopt(easy_handle, CURLOPT_CAINFO, pCaPath);
} // 执行数据请求
printf("hello https---------------\n");
while()
{
char testbuf[];
static testCnn = ; testCnn++;
snprintf(testbuf,sizeof(testbuf), "test cnn = %d", testCnn);
curl_easy_setopt(easy_handle,CURLOPT_POSTFIELDS,testbuf); //post参数
return_code = curl_easy_perform(easy_handle);
if (return_code != CURLE_OK)
{
switch(return_code)
{
case CURLE_UNSUPPORTED_PROTOCOL:
fprintf(stderr,"不支持的协议,由URL的头部指定\n");
case CURLE_COULDNT_CONNECT:
fprintf(stderr,"不能连接到remote主机或者代理\n");
case CURLE_HTTP_RETURNED_ERROR:
fprintf(stderr,"http返回错误\n");
case CURLE_READ_ERROR:
fprintf(stderr,"读本地文件错误\n");
default:
fprintf(stderr,"返回值:%d\n",return_code);
}
return -;
}
sleep();
}
// 释放资源
sleep();
fclose(fp);
curl_easy_cleanup(easy_handle);
curl_global_cleanup(); return ;
}

gcc -o curlTest curlTest.c -l curl

2 ARM板上curl的移植

因为要支持https需要移植openssl 和 curl

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

2.1 Openssl移植

开发环境

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

移植步骤

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执行文件即可。

curl支持HTTP和https的更多相关文章

  1. curl 支持 http2

    让 curl 支持 HTTP2 我们需要安装 nghttp2(http2 的 C 语言库) 源码安装 安装 nghttp2 git clone https://github.com/tatsuhiro ...

  2. CentOS 6.8 curl支持的NSS修改为OpenSSL的方法

    在CentOS 6.8的系统里面的curl支持的https是nss版本的,而不是openssl,所以在php使用curl访问https的时候会报Unable to load client key -8 ...

  3. [archlinux][tls] archlinux下使curl支持sslv3的方法

    描述 在archlinux下,希望使用curl产生一条使用sslv3的https访问请求. 使用curl的如下命令: curl -k -vvv --sslv3 https://192.168.7.9: ...

  4. php之curl实现http与https请求的方法

    原文地址:http://m.jb51.net/show/56492   这篇文章主要介绍了php之curl实现http与https请求的方法,分别讲述了PHP访问http网页与访问https网页的实例 ...

  5. Https系列之三:让服务器同时支持http、https,基于spring boot

    Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...

  6. 牛客网Java刷题知识点之UDP协议是否支持HTTP和HTTPS协议?为什么?TCP协议支持吗?

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  7. Spring Boot项目如何同时支持HTTP和HTTPS协议

    如今,企业级应用程序的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HTTPS两种协议. 准备 为了使用HTTPS连接器,需要生成一 ...

  8. nginx将http升级到https并且同时支持http和https两种请求、http自动转向https

    1.http升级到https 1.1.检查 Nginx 是否支持 SSL /usr/local/nginx/sbin/nginx -V configure arguments中是否有--with-ht ...

  9. 【Nginx】将http升级到https并且同时支持http和https两种请求

    一.如何将http升级到https 需要满足下面三个: 1.域名 2.nginx 3.SSL证书     一般第三方证书颁发机构下发的证书是收费的,一年好几千.    1) 从腾讯云申请免费的SSL证 ...

随机推荐

  1. java语法基础(总结)

    1,关键字:其实就是某种语言赋予了特殊含义的单词. 保留字:其实就是还没有赋予特殊含义,但是准备日后要使用过的单词. 2,标示符:其实就是在程序中自定义的名词.比如类名,变量名,函数名.包含 0-9. ...

  2. 2018年东北农业大学春季校赛-wyh的吃鸡

    BFS: 1. 从起点开始BFS,遇到X点则return: 2. vis[px][py][0]代表经过pxpy这点前还没有找到车: vis[px][py][1]代表经过pxpy这点前已经找到车: 3. ...

  3. Python-字符串及列表操作-Day2

    1.数据类型 1.1 变量引出数据类型 变量:用来记录状态变量值的变化就是状态的变化,程序运行的本质就是来处理一系列的变化 1.2 五大基本数据类型: 数字 字符串 列表 元组 字典 1.2.1 数字 ...

  4. OpenID Connect + OAuth2.0

    一.问题的提出 现代应用程序或多或少都是如下这样的架构: 在这种情况下,前端.中间层和后端都需要进行验证和授权来保护资源,所以不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能.为了解决这样的问题 ...

  5. LDAP apacheds解决方案

    Apache DS 配置与管理   LADP基本介绍 LDAP(轻量级目录访问协议)以目录的形式来管理资源(域用户,用户组,地址簿,邮件用户,打印机等等).   特点: 1. LDAP是一种网略协议而 ...

  6. python爬虫——分析天猫iphonX的销售数据

    01.引言 这篇文章是我最近刚做的一个项目,会带领大家使用多种技术实现一个非常有趣的项目,该项目是关于苹果机(iphoneX)的销售数据分析,是网络爬虫和数据分析的综合应用项目.本项目会分别从天猫和京 ...

  7. HTML初识

    HTML初识 web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) so ...

  8. Hibernate(十六):Hibernate二级缓存

    Hibernate缓存 缓存(Cache):计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如磁盘上的文件或者数据库)之间,起作用是降低应用程序直接读取永久性数据存储源的频率,从而提高应用 ...

  9. Python系列 - 进程和线程

    进程和线程 可以通过ucos-Ⅱ来学习相关的基础,很好的学习资料 进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作), 而此时CPU只能静静地等待任务A读取完 ...

  10. 深度学习中Xavier初始化

    "Xavier"初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文<Understanding the difficulty of training ...