帮我用c++写一个https的连接 使用openssl库
时间: 2023-05-18 22:03:52 浏览: 116
linux c++实现https
3星 · 编辑精心推荐
当然可以,以下是一个简单的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#define SERVER "www.example.com"
#define PORT 443
int main(int argc, char *argv[]) {
int sockfd;
struct sockaddr_in serv_addr;
struct hostent *server;
SSL_CTX *ctx;
SSL *ssl;
char buffer[1024];
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 获取服务器地址
server = gethostbyname(SERVER);
if (server == NULL) {
fprintf(stderr, "gethostbyname: %s\n", hstrerror(h_errno));
exit(EXIT_FAILURE);
}
// 初始化服务器地址结构体
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("connect");
exit(EXIT_FAILURE);
}
// 初始化 SSL
SSL_library_init();
ctx = SSL_CTX_new(TLS_client_method());
if (ctx == NULL) {
ERR_print_errors_fp(stderr);
exit(EXIT_FAILURE);
}
// 创建 SSL 对象
ssl = SSL_new(ctx);
if (ssl == NULL) {
ERR_print_errors_fp(stderr);
exit(EXIT_FAILURE);
}
// 将 socket 与 SSL 对象绑定
SSL_set_fd(ssl, sockfd);
// 建立 SSL 连接
if (SSL_connect(ssl) < 0) {
ERR_print_errors_fp(stderr);
exit(EXIT_FAILURE);
}
// 发送请求
char *request = "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n";
SSL_write(ssl, request, strlen(request));
// 接收响应
int n = SSL_read(ssl, buffer, sizeof(buffer) - 1);
if (n < 0) {
ERR_print_errors_fp(stderr);
exit(EXIT_FAILURE);
}
buffer[n] = '\0';
printf("%s", buffer);
// 关闭 SSL 连接和 socket
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
close(sockfd);
return 0;
}
```
这个代码使用 OpenSSL 库建立了一个 HTTPS 连接,并发送了一个 GET 请求,然后接收并输出了服务器的响应。你可以根据自己的需要修改请求内容和响应处理方式。
阅读全文