Tcp supports connection to inet sockets and unix sockets.
These are two different types. We use 'a Where_to_connect.t to specify a socket to
connect to, where the 'a identifies the type of socket.
module Where_to_connect : sig ... endA Where_to_connect describes the socket that a tcp client should connect to.
type 'a with_connect_options = ?buffer_age_limit:[ `At_most of Core.Time.Span.t | `Unlimited ] ‑> ?interrupt:unit Async_extra__.Import.Deferred.t ‑> ?reader_buffer_size:int ‑> ?writer_buffer_size:int ‑> ?timeout:Core.Time.Span.t ‑> 'aval with_connection : ('addr Where_to_connect.t ‑> (([ `Active ], 'addr) Async_extra__.Import.Socket.t ‑> Async_extra__.Import.Reader.t ‑> Async_extra__.Import.Writer.t ‑> 'a Async_extra__.Import.Deferred.t) ‑> 'a Async_extra__.Import.Deferred.t) with_connect_optionswith_connection ~host ~port f looks up host from a string (using DNS as needed),
connects, then calls f, passing the connected socket and a reader and writer for it.
When the deferred returned by f is determined, or any exception is thrown, the
socket, reader and writer are closed. The returned Deferred.t is fulfilled after
f has finished processing and the file descriptor for the socket is closed. If
interrupt is supplied, the connection attempt will be aborted if interrupt is
fulfilled before the connection has been established. Similarly, all connection
attempts have a timeout (default 10s), which can be overridden with timeout.
It is fine for f to ignore the supplied socket and just use the reader and writer.
The socket is there to make it convenient to call Socket functions.
val connect_sock : ?socket:([ `Unconnected ], 'addr) Async_extra__.Import.Socket.t ‑> ?interrupt:unit Async_extra__.Import.Deferred.t ‑> ?timeout:Core.Time.Span.t ‑> 'addr Where_to_connect.t ‑> ([ `Active ], 'addr) Async_extra__.Import.Socket.t Async_extra__.Import.Deferred.tconnect_sock where_to_connect creates a socket and opens a TCP connection. To use
an existing socket, supply ~socket. Any errors in the connection will be reported
to the monitor that was current when connect_sock was called.
val connect : ?socket:([ `Unconnected ], 'addr) Async_extra__.Import.Socket.t ‑> ('addr Where_to_connect.t ‑> (([ `Active ], 'addr) Async_extra__.Import.Socket.t * Async_extra__.Import.Reader.t * Async_extra__.Import.Writer.t) Async_extra__.Import.Deferred.t) with_connect_optionsconnect ~host ~port is a convenience wrapper around connect_sock that returns the
socket, and a reader and writer for the socket. The reader and writer share a file
descriptor, and so closing one will affect the other by closing its underlying fd.
In particular, closing the reader before closing the writer will cause the writer to
subsequently raise an exception when it attempts to flush internally-buffered bytes to
the OS, due to a closed fd. You should close the Writer first to avoid this
problem.
If possible, use with_connection, which automatically handles closing.
It is fine to ignore the returned socket and just use the reader and writer. The
socket is there to make it convenient to call Socket functions.
module Bind_to_address : sig ... endmodule Bind_to_port : sig ... endmodule Where_to_listen : sig ... endA Where_to_listen describes the socket that a tcp server should listen on.