#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
int main() {
char *host = "www.example.com"; // 请求的主机名
char *path = "/"; // 请求的路径
char request[1024]; // 请求消息
char buffer[1024]; // 接收服务器响应的缓冲区
int sockfd; // 套接字
struct sockaddr_in server_addr; // 服务器地址
SSL_CTX *ctx; // SSL上下文
SSL *ssl; // SSL会话
// 初始化SSL库
SSL_library_init();
// 创建SSL上下文
if ((ctx = SSL_CTX_new(TLS_client_method())) == NULL) {
perror("SSL_CTX_new");
exit(EXIT_FAILURE);
}
// 创建套接字
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(443);
if (inet_pton(AF_INET, host, &server_addr.sin_addr) <= 0) {
perror("inet_pton");
exit(EXIT_FAILURE);
}
// 连接服务器
if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
perror("connect");
exit(EXIT_FAILURE);
}
// 创建SSL会话
if ((ssl = SSL_new(ctx)) == NULL) {
perror("SSL_new");
exit(EXIT_FAILURE);
}
// 将套接字绑定到SSL会话
SSL_set_fd(ssl, sockfd);
// 启动SSL握手
if (SSL_connect(ssl) <= 0) {
perror("SSL_connect");
exit(EXIT_FAILURE);
}
// 构造HTTP请求消息
sprintf(request, "GET %s HTTP/1.1\r\n"
"Host: %s\r\n"
"Connection: close\r\n"
"\r\n", path, host);
// 发送HTTP请求消息
if (SSL_write(ssl, request, strlen(request)) < 0) {
perror("SSL_write");
exit(EXIT_FAILURE);
}
// 接收服务器响应消息
while (SSL_read(ssl, buffer, sizeof(buffer)) > 0) {
printf("%s", buffer);
}
// 关闭SSL会话和套接字
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
close(sockfd);
return 0;
}
使用C语言编写的简单HTTPS请求程序示例
最新推荐文章于 2024-03-17 14:37:15 发布