[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
11.2.4 Input and Output
The underlying transport of a TLS session can be any Scheme
input/output port (see (guile)Ports and File Descriptors section `Ports and File Descriptors' in The GNU Guile Reference Manual). This has to be specified using
set-session-transport-port!
.
However, for better performance, a raw file descriptor can be
specified, using set-session-transport-fd!
. For instance, if
the transport layer is a socket port over an OS-provided socket, you
can use the port->fdes
or fileno
procedure to obtain the
underlying file descriptor and pass it to
set-session-transport-fd!
(see port->fdes
and fileno
: (guile)Ports and File Descriptors section `Ports and File Descriptors' in The GNU Guile Reference Manual). This would work as follows:
(let ((socket (socket PF_INET SOCK_STREAM 0)) (session (make-session connection-end/client))) ;; ;; Establish a TCP connection... ;; ;; Use the file descriptor that underlies SOCKET. (set-session-transport-fd! session (fileno socket))) |
Once a TLS session is established, data can be communicated through it
(i.e., via the TLS record layer) using the port returned by
session-record-port
:
(let ((session (make-session connection-end/client))) ;; ;; Initialize the various parameters of SESSION, set up ;; a network connection, etc... ;; (let ((i/o (session-record-port session))) (write "Hello peer!" i/o) (let ((greetings (read i/o))) ;; ... (bye session close-request/rdwr)))) |
A lower-level I/O API is provided by record-send
and
record-receive!
which take an SRFI-4 vector to represent the
data sent or received. While it might improve performance, it is much
less convenient than the above and should rarely be needed.