下面是一个用openssl 实现获取https 网页内容的demo,整个流程比较简单,主要封装的API如下
static int https_init(https_context_t *context,const char* url);
static int https_uninit(https_context_t *context);
static int https_read(https_context_t *context,void* buff,int len);
static int https_write(https_context_t *context,const void* buff,int len);
static int https_get_status_code(https_context_t *context);
static int https_read_content(https_context_t *context,char *resp_contet,int max_len);
通信流程:
1、初始化,解析url资源,创建socket 连接,绑定ssl
2、发送http 请求
3、获取请求返回的状态码
4、获取请求返回的数据
5、销毁动态申请的内存资源
为了方便学习,我就把整个代码贴在下面
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <openssl/ssl.h>
#include <openssl/bio.h>
#define HTTP_REQ_LENGTH 512
#define HTTP_RESP_LENGTH 20480
typedef struct
{
int sock_fd;
SSL_CTX *ssl_ct;
SSL *ssl;
//url 解析出来的信息
char *host;
char *path;
int port;
} https_context_t;
static int https_init(https_context_t *context,const char* url);
static int https_uninit(https_context_t *context);
static int https_read(https_context_t *context,void* buff,int len);
static int https_write(https_context_t *context,const void* buff,int len);
static int https_get_status_code(https_context_t *context);
static int https_read_content(https_context_t *context,char *resp_contet,int max_len);
// http 请求头信息
static char https_header[] =
"GET %s HTTP/1.1\r\n"
"Host: %s:%d\r\n"
"Connection: Close\r\n"
"Accept: */*\r\n"
"\r\n";
static char http_req_content[HTTP_REQ_LENGTH] = {0};
static char https_resp_content[HTTP_RESP_LENGTH+1] = {0};
static int create_request_socket(const char* host,const int port)
{