Tcp supports connection to
inet sockets and
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 ... end
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_kernel.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_unix.Socket.t -> Async_unix.Reader.t -> Async_unix.Writer.t -> 'a Async_kernel.Deferred.t) -> 'a Async_kernel.Deferred.t) with_connect_options
with_connection where_to_connect f looks up
where_to_connect (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
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
val connect_sock : ?socket:([ `Unconnected ], 'addr) Async_unix.Socket.t -> ?interrupt:unit Async_kernel.Deferred.t -> ?timeout:Core.Time.Span.t -> 'addr Where_to_connect.t -> ([ `Active ], 'addr) Async_unix.Socket.t Async_kernel.Deferred.t
connect_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_unix.Socket.t -> ('addr Where_to_connect.t -> (([ `Active ], 'addr) Async_unix.Socket.t * Async_unix.Reader.t * Async_unix.Writer.t) Async_kernel.Deferred.t) with_connect_options
connect where_to_connect 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
module Bind_to_address : sig ... end
module Bind_to_port : sig ... end
module Where_to_listen : sig ... end
Where_to_listen describes the socket that a tcp server should listen on.
module Server : sig ... end
Server.t represents a TCP server listening on a socket.