module Address : sig ... endmodule Family : sig ... endtype (+'a, 'b) t constraint 'a = [< `Unconnected | `Bound | `Passive | `Active ] and 'b = [< Address.t ]Sockets have a phantom type parameter that tracks the state of the socket in order
to eliminate certain errors in which socket functions are called in the wrong order.
Initially, a socket is `Unconnected. As various socket functions are called, they
return a socket with a new phantom state. Here is a chart of the allowed state
transitions.
Unconnected ---connect--> Active
|
| ---bind--> Bound ---listen--> Passive ---accept---> Active
|
| ---connect--> Activeinclude sig ... endval sexp_of_t : ('a ‑> Base.Sexp.t) ‑> ('b ‑> Base.Sexp.t) ‑> ('a, 'b) t ‑> Base.Sexp.tmodule Type : sig ... endval connect : ([< `Unconnected | `Bound ], 'addr) t ‑> 'addr ‑> ([ `Active ], 'addr) t Async_unix__.Import.Deferred.tval connect_interruptible : ([< `Unconnected | `Bound ], 'addr) t ‑> 'addr ‑> interrupt:unit Async_unix__.Import.Deferred.t ‑> [ `Ok of ([ `Active ], 'addr) t | `Interrupted ] Async_unix__.Import.Deferred.tval bind : ?reuseaddr:bool ‑> ([ `Unconnected ], 'addr) t ‑> 'addr ‑> ([ `Bound ], 'addr) t Async_unix__.Import.Deferred.tbind socket addr sets close_on_exec for the fd of socket.
val bind_inet : ?reuseaddr:bool ‑> ([ `Unconnected ], Address.Inet.t) t ‑> Address.Inet.t ‑> ([ `Bound ], Address.Inet.t) tbind_inet socket addr is just like bind but is restricted to Inet.t addresses
and is therefore guaranteed not to block.
val accept : ([ `Passive ], 'addr) t ‑> [ `Ok of ([ `Active ], 'addr) t * 'addr | `Socket_closed ] Async_unix__.Import.Deferred.tval accept_interruptible : ([ `Passive ], 'addr) t ‑> interrupt:unit Async_unix__.Import.Deferred.t ‑> [ `Ok of ([ `Active ], 'addr) t * 'addr | `Socket_closed | `Interrupted ] Async_unix__.Import.Deferred.tval accept_at_most : ([ `Passive ], 'addr) t ‑> limit:int ‑> [ `Ok of (([ `Active ], 'addr) t * 'addr) list | `Socket_closed ] Async_unix__.Import.Deferred.taccept_at_most is like accept, but will return up to limit connections before
yielding, where limit >= 1. accept_at_most first waits for one connection and
then attempts to retrieve up to limit connections through non-blocking
Unix.accept calls. If a call to Unix.accept would block before limit is
reached, accept_at_most returns the connections retrieved thus far.
Servers that must service a large number of connections tend to observe a stall in
connection accept rates when under heavy load. Increasing limit will ameliorate
this effect, and increase accept rates and overall throughput of the server at the
cost of increased contention for resources amongst connections.
For details, see:
Acceptable strategies for improving web server performance
Brecht, Pariag, and Gammo. USENIX ATEC '04val accept_at_most_interruptible : ([ `Passive ], 'addr) t ‑> limit:int ‑> interrupt:unit Async_unix__.Import.Deferred.t ‑> [ `Ok of (([ `Active ], 'addr) t * 'addr) list | `Socket_closed | `Interrupted ] Async_unix__.Import.Deferred.tval shutdown : ('a, 'addr) t ‑> [ `Receive | `Send | `Both ] ‑> unitval fd : ('a, 'addr) t ‑> Async_unix.Fd.tval of_fd : Async_unix.Fd.t ‑> 'addr Type.t ‑> ('a, 'addr) tval getsockname : ('a, 'addr) t ‑> 'addrval getpeername : ('a, 'addr) t ‑> 'addrmodule Opt : sig ... endval mcast_join : ?ifname:string ‑> ?source:Inet_addr.t ‑> ('a, 'addr) t ‑> 'addr ‑> unitval mcast_leave : ?ifname:string ‑> ('a, 'addr) t ‑> 'addr ‑> unitval bind_to_interface_exn : (([ `Unconnected ], _) t ‑> [ `Any | `Interface_name of string ] ‑> unit) Core.Or_error.tbind_to_interface_exn t (`Interface_name "eth0") restricts messages from being
received or sent on interfaces other than eth0. See
Linux_ext.bind_to_interface.
Typically, one would use this function for very specific non-multicast requirements. For similar functionality when using multicast, see Core_unix.mcast_set_ifname.