---
name: "libressl-SSL_connect"
section: "3"
platform: "linux"
package: "libressl"
version: "4.4.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/libressl-SSL_connect"
---

# libressl-SSL\_connect(3)

initiate the TLS/SSL handshake with a TLS/SSL server

## NAME

**SSL\_connect** – initiate the TLS/SSL handshake with a TLS/SSL server

## SYNOPSIS

SSL Library (libssl, -lssl) libcrypto

**#include \<openssl/ssl.h\>**

*int*\

**SSL\_connect**(*SSL \*ssl*);

## DESCRIPTION

**SSL\_connect**() initiates the TLS/SSL handshake with a server. The communication channel must already have been set and assigned to the *ssl* by setting an underlying *BIO*.

The behaviour of **SSL\_connect**() depends on the underlying *BIO*.

If the underlying *BIO* is *blocking*, **SSL\_connect**() will only return once the handshake has been finished or an error occurred.

If the underlying *BIO* is *non-blocking*, **SSL\_connect**() will also return when the underlying *BIO* could not satisfy the needs of **SSL\_connect**() to continue the handshake, indicating the problem with the return value −1. In this case a call to SSL\_get\_error(3) with the return value of **SSL\_connect**() will yield SSL\_ERROR\_WANT\_READ or SSL\_ERROR\_WANT\_WRITE. The calling process then must repeat the call after taking appropriate action to satisfy the needs of **SSL\_connect**(). The action depends on the underlying *BIO*. When using a non-blocking socket, nothing is to be done, but [select(2)](/select/2.md) can be used to check for the required condition. When using a buffering *BIO*, like a *BIO* pair, data must be written into or retrieved out of the *BIO* before being able to continue.

## RETURN VALUES

The following return values can occur:

- 0

  The TLS/SSL handshake was not successful but was shut down controlled and by the specifications of the TLS/SSL protocol. Call SSL\_get\_error(3) with the return value *ret* to find out the reason.

- 1

  The TLS/SSL handshake was successfully completed, and a TLS/SSL connection has been established.

- \<0

  The TLS/SSL handshake was not successful, because either a fatal error occurred at the protocol level or a connection failure occurred. The shutdown was not clean. It can also occur if action is needed to continue the operation for non-blocking *BIO*s. Call SSL\_get\_error(3) with the return value *ret* to find out the reason.

## SEE ALSO

BIO\_new(3), [ssl(3)](/ssl/3.md), SSL\_accept(3), SSL\_CTX\_new(3), SSL\_do\_handshake(3), SSL\_get\_error(3), SSL\_set\_connect\_state(3), SSL\_shutdown(3)

## HISTORY

**SSL\_connect**() appeared in SSLeay 0.4 or earlier and has been available since OpenBSD 2.4.
