When I type gnutls-cli -p 443 stackoverflow.com
on the Linux command line, the HTTPS connection is established successfully.
But my C program to establish the same type of connection does not work. What am I missing?
int main (){ int Result_d, SocketFileDescriptor; gnutls_session_t GnutlsSession; struct sockaddr_in SockAddr; SocketFileDescriptor = socket (AF_INET, SOCK_STREAM, 0); if (SocketFileDescriptor == -1) return 0; SockAddr.sin_family = AF_INET; SockAddr.sin_port = htons (443u); SockAddr.sin_addr.s_addr = (7u << 24u) | (32u << 16u) | (18u << 8u) | 104u; // `host -t a stackoverflow.com` outputs 104.18.32.7 Result_d = connect (SocketFileDescriptor, (struct sockaddr *) & SockAddr, sizeof (SockAddr)); if (Result_d != 0) return 0; Result_d = gnutls_init (& GnutlsSession, GNUTLS_CLIENT); if (Result_d != GNUTLS_E_SUCCESS) return 0; Result_d = gnutls_set_default_priority (GnutlsSession); if (Result_d != GNUTLS_E_SUCCESS) return 0; gnutls_transport_set_int (GnutlsSession, SocketFileDescriptor); Result_d = gnutls_server_name_set (GnutlsSession, GNUTLS_NAME_DNS, "stackoverflow.com", 17u); if (Result_d != GNUTLS_E_SUCCESS) return 0; Result_d = gnutls_handshake (GnutlsSession); if (Result_d != GNUTLS_E_SUCCESS) { fprintf (stderr, "gnutls_handshake() returned: %s\n", gnutls_strerror (Result_d)); return 0; } return 0;}
The output is:gnutls_handshake() returned: A TLS fatal alert has been received.