使用C语言编写的简单HTTPS请求程序示例

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值