module Address : sig ... end
module Family : sig ... end
type (+'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--> Active
include sig ... end
val sexp_of_t : ('a ‑> Sexplib.Sexp.t) ‑> ('b ‑> Sexplib.Sexp.t) ‑> ('a, 'b) t ‑> Sexplib.Sexp.t
module Type : sig ... end
val connect : ([< `Unconnected | `Bound ], 'addr) t ‑> 'addr ‑> ([ `Active ], 'addr) t Import.Deferred.t
val connect_interruptible : ([< `Unconnected | `Bound ], 'addr) t ‑> 'addr ‑> interrupt:unit Import.Deferred.t ‑> [ `Ok of ([ `Active ], 'addr) t | `Interrupted ] Import.Deferred.t
val bind : ?reuseaddr:bool ‑> ([ `Unconnected ], 'addr) t ‑> 'addr ‑> ([ `Bound ], 'addr) t Import.Deferred.t
bind socket addr
sets close_on_exec for the fd of socket
.
val accept : ([ `Passive ], 'addr) t ‑> [ `Ok of ([ `Active ], 'addr) t * 'addr | `Socket_closed ] Import.Deferred.t
val accept_interruptible : ([ `Passive ], 'addr) t ‑> interrupt:unit Import.Deferred.t ‑> [ `Ok of ([ `Active ], 'addr) t * 'addr | `Socket_closed | `Interrupted ] Import.Deferred.t
val accept_at_most : ([ `Passive ], 'addr) t ‑> limit:int ‑> [ `Ok of (([ `Active ], 'addr) t * 'addr) list | `Socket_closed ] Import.Deferred.t
accept_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 '04
val accept_at_most_interruptible : ([ `Passive ], 'addr) t ‑> limit:int ‑> interrupt:unit Import.Deferred.t ‑> [ `Ok of (([ `Active ], 'addr) t * 'addr) list | `Socket_closed | `Interrupted ] Import.Deferred.t
val shutdown : ('a, 'addr) t ‑> [ `Receive | `Send | `Both ] ‑> unit
val getsockname : ('a, 'addr) t ‑> 'addr
val getpeername : ('a, 'addr) t ‑> 'addr
module Opt : sig ... end
val mcast_join : ?ifname:string ‑> ?source:Inet_addr.t ‑> ('a, 'addr) t ‑> 'addr ‑> unit
val mcast_leave : ?ifname:string ‑> ('a, 'addr) t ‑> 'addr ‑> unit
val bind_to_interface_exn : (([ `Unconnected ], _) t ‑> [ `Any | `Interface_name of string ] ‑> unit) Core.Or_error.t
bind_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.