



@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
