You may be in a situation where something else produces the sockets for you (such as an event-loop) or you otherwise need to manage the socket rather then allowing something else to.
#include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <openssl/ssl.h> int main(int argc, char *argv[]) { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (!sockfd) { printf("Error creating socket.\n"); return -1; } struct sockaddr_in sa; memset (&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr("172.217.2.196"); sa.sin_port = htons (443); socklen_t socklen = sizeof(sa); if (connect(sockfd, (struct sockaddr *)&sa, socklen)) { printf("Error connecting to server.\n"); return -1; } SSL_library_init(); SSLeay_add_ssl_algorithms(); SSL_load_error_strings(); const SSL_METHOD *meth = TLSv1_2_client_method(); SSL_CTX *ctx = SSL_CTX_new (meth); SSL *ssl = SSL_new (ctx); if (ssl == NULL) { printf("Could not create SSL context.\n"); return -1; } SSL_set_fd(ssl, sockfd); int err = SSL_connect(ssl); if (err <= 0) { printf("Could not connect.\n"); return -1; } printf ("SSL connection using %s\n", SSL_get_cipher (ssl)); // Do send/receive here. return 0; }
Adapted from openssl-in-c-socket-connection-https-client, and works with both OpenSSL and BoringSSL.