@deftypefun {ssize_t} {gnutls_record_send} (gnutls_session_t @var{session}, const void * @var{data}, size_t @var{data_size}) @var{session}: is a @code{gnutls_session_t} type. @var{data}: contains the data to send @var{data_size}: is the length of the data This function has the similar semantics with @code{send()} . The only difference is that it accepts a GnuTLS session, and uses different error codes. Note that if the send buffer is full, @code{send()} will block this function. See the @code{send()} documentation for more information. You can replace the default push function which is @code{send()} , by using @code{gnutls_transport_set_push_function()} . If the EINTR is returned by the internal push function then @code{GNUTLS_E_INTERRUPTED} will be returned. If @code{GNUTLS_E_INTERRUPTED} or @code{GNUTLS_E_AGAIN} is returned, you must call this function again with the exact same parameters, or provide a @code{NULL} pointer for @code{data} and 0 for @code{data_size} , in order to write the same data as before. If you wish to discard the previous data instead of retrying, you must call @code{gnutls_record_discard_queued()} before calling this function with different parameters. Note that the latter works only on special transports (e.g., UDP). cf. @code{gnutls_record_get_direction()} . Note that in DTLS this function will return the @code{GNUTLS_E_LARGE_PACKET} error code if the send data exceed the data MTU value - as returned by @code{gnutls_dtls_get_data_mtu()} . The errno value EMSGSIZE also maps to @code{GNUTLS_E_LARGE_PACKET} . Note that since 3.2.13 this function can be called under cork in DTLS mode, and will refuse to send data over the MTU size by returning @code{GNUTLS_E_LARGE_PACKET} . @strong{Returns:} The number of bytes sent, or a negative error code. The number of bytes sent might be less than @code{data_size} . The maximum number of bytes this function can send in a single call depends on the negotiated maximum record size. @end deftypefun