https client in C

* https_client.c

cpp 复制代码
/* 
 * You'll need to have OpenSSL installed on your system for this to work.
 * cc -g https_client.c -lssl -lcrypto
 * ./a.out
 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <arpa/inet.h>
#include <netdb.h>

#define HOST "www.douyin.com"
#define PORT 443  // HTTPS port

// Function to create and connect a socket
int create_socket(const char *host, const char *port) {
    struct addrinfo hints, *res;
    int sockfd;

    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;

    if (getaddrinfo(host, port, &hints, &res) != 0) {
        perror("getaddrinfo");
        exit(EXIT_FAILURE);
    }

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (sockfd == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    if (connect(sockfd, res->ai_addr, res->ai_addrlen) == -1) {
        perror("connect");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    freeaddrinfo(res);
    return sockfd;
}

// Function to initialize OpenSSL and create an SSL context
SSL_CTX* initialize_ssl() {
    SSL_CTX *ctx;
    SSL_library_init();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();

    ctx = SSL_CTX_new(TLS_client_method());
    if (ctx == NULL) {
        ERR_print_errors_fp(stderr);
        exit(EXIT_FAILURE);
    }

    return ctx;
}

// Function to send an HTTP GET request and receive the response
void send_https_request(SSL *ssl) {
    // HTTP GET request
    const char *request = "GET / HTTP/1.1\r\n"
                          "Host: " HOST "\r\n"
                          "Connection: close\r\n"
                          "\r\n";

    // Send the HTTP request over SSL
    SSL_write(ssl, request, strlen(request));

    // Receive and print the HTTP response
    char buffer[4096];
    int bytes;
    while ((bytes = SSL_read(ssl, buffer, sizeof(buffer) - 1)) > 0) {
        buffer[bytes] = '\0';
        printf("%s", buffer);
    }
}

int main() {
    const char *hostname = HOST;
    const char *port = "443";

    // Initialize SSL context
    SSL_CTX *ctx = initialize_ssl();

    // Create and connect the socket
    int sockfd = create_socket(hostname, port);

    // Create an SSL object
    SSL *ssl = SSL_new(ctx);
    SSL_set_fd(ssl, sockfd);

    // Establish the SSL connection
    if (SSL_connect(ssl) != 1) {
        ERR_print_errors_fp(stderr);
        exit(EXIT_FAILURE);
    }

    printf("SSL handshake completed successfully.\n");

    // Send the HTTP request and print the response
    send_https_request(ssl);

    // Clean up
    SSL_shutdown(ssl);
    SSL_free(ssl);
    close(sockfd);
    SSL_CTX_free(ctx);
    EVP_cleanup();

    return 0;
}

$ cc -g https_client.c -lssl -lcrypto

$ ./a.out

SSL handshake completed successfully.

HTTP/1.1 403 Forbidden

Server: Tengine

Content-Length: 0

Connection: close

Date: Fri, 28 Feb 2025 01:56:51 GMT

X-TT-System-Error: 3

Proxy-Status: 0000201403062000

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

Access-Control-Allow-Credentials: true

x-tt-trace-host: 0158941ad0ccfeec46825ab9fc54a041b7522659c6025178d87b37b30a129970ae1c79d103c0869a874573eb2280b0f49168edd6e5c61d3174905406bf3cafc890

x-tt-trace-tag: id=03;cdn-cache=miss;type=dyn

x-tt-trace-id: 00-250228095651DE5EF1BEE800484DA0B3-4CE170E36114905B-00

X-TT-LOGID: 20250228095651DE5EF1BEE800484DA0B3

x-alicdn-da-ups-status: endOs,0,403

Via: cache29.l2nu1616,0, ens-cache4.es6172,0

server-timing: cdn-cache;desc=MISS,edge;dur=156,origin;dur=16

Timing-Allow-Origin: *

EagleId: 2ff62d9817407078115605848e

相关推荐
157092511343 小时前
Android进阶之光:HTTP协议原理深度解析
android·网络协议·http
xiangyun617 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun617 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
可爱系程序猿7 小时前
WSD 打印机时好时坏:从发现服务、地址变化到 Standard TCP/IP 端口的迁移记录
网络·网络协议·tcp/ip·程序人生·电脑
Logic1019 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
Escalating_xu9 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
Navigator_Z9 小时前
LeetCode //C - 1250. Check If It Is a Good Array
c语言·算法·leetcode
2501_9160088911 小时前
全平台抓包工具,Windows、iPhone、Linux三个平台抓包测试
网络协议·计算机网络·网络安全·ios·adb·https·udp
SuperByteMaster11 小时前
freertos 任务创建方式
c语言
susplus12 小时前
【传感器DS18B20】51单片机上实现温度采集
c语言·51单片机·ds18b20·温度采集