Module Async_extra.Tcp
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_connectdescribes 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 -> 'a
val 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 where_to_connect flooks upwhere_to_connect(using DNS as needed), connects, then callsf, passing the connected socket and a reader and writer for it. When the deferred returned byfis determined, or any exception is thrown, the socket, reader and writer are closed. The returnedDeferred.tis fulfilled afterfhas finished processing and the file descriptor for the socket is closed. Ifinterruptis supplied, the connection attempt will be aborted ifinterruptis fulfilled before the connection has been established. Similarly, all connection attempts have a timeout (default 10s), which can be overridden withtimeout.It is fine for
fto ignore the supplied socket and just use the reader and writer. The socket is there to make it convenient to callSocketfunctions.
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_connectcreates 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 whenconnect_sockwas 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 where_to_connectis a convenience wrapper aroundconnect_sockthat 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 underlyingfd. 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 closedfd. You should close theWriterfirst 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
Socketfunctions.
module Bind_to_address : sig ... endmodule Bind_to_port : sig ... endmodule Where_to_listen : sig ... endA
Where_to_listendescribes the socket that a tcp server should listen on.
module Server : sig ... endA
Server.trepresents a TCP server listening on a socket.