* 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.l2nu16[16,0], ens-cache4.es6[172,0]
server-timing: cdn-cache;desc=MISS,edge;dur=156,origin;dur=16
Timing-Allow-Origin: *
EagleId: 2ff62d9817407078115605848e