Module Eio.Net

Networking.

Example:

let addr = `Tcp (Ipaddr.V4.loopback, 8080)

let http_get ~net ~stdout addr =
  Switch.run @@ fun sw ->
  let flow = Net.connect ~sw net addr in
  Flow.copy_string "GET / HTTP/1.0\r\n\r\n" flow;
  Flow.shutdown flow `Send;
  Flow.copy flow stdout
exception Connection_reset of exn
module Ipaddr : sig ... end

IP addresses.

module Sockaddr : sig ... end

Network addresses.

Provider Interfaces

class virtual socket : object ... end
class virtual stream_socket : object ... end
class virtual datagram_socket : object ... end
class virtual listening_socket : object ... end
class virtual t : object ... end

Out-bound Connections

val connect : sw:Switch.t -> t -> Sockaddr.stream -> < stream_socket ; Flow.close >

connect ~sw t addr is a new socket connected to remote address addr.

The new socket will be closed when sw finishes, unless closed manually first.

Incoming Connections

val listen : ?reuse_addr:bool -> ?reuse_port:bool -> backlog:int -> sw:Switch.t -> t -> Sockaddr.stream -> listening_socket

listen ~sw ~backlog t addr is a new listening socket bound to local address addr.

The new socket will be closed when sw finishes, unless closed manually first.

For (non-abstract) Unix domain sockets, the path will be removed afterwards.

  • parameter backlog

    The number of pending connections that can be queued up (see listen(2)).

  • parameter reuse_addr

    Set the Unix.SO_REUSEADDR socket option. For Unix paths, also remove any stale left-over socket.

  • parameter reuse_port

    Set the Unix.SO_REUSEPORT socket option.

accept ~sw socket waits until a new connection is ready on socket and returns it.

The new socket will be closed automatically when sw finishes, if not closed earlier. If you want to handle multiple connections, consider using accept_fork instead.

val accept_fork : sw:Switch.t -> listening_socket -> on_error:( exn -> unit ) -> ( stream_socket -> Sockaddr.stream -> unit ) -> unit

accept_fork socket fn accepts a connection and handles it in a new fiber.

After accepting a connection to socket, it runs fn flow client_addr in a new fiber.

flow will be closed when fn returns.

val accept_sub : sw:Switch.t -> listening_socket -> on_error:( exn -> unit ) -> ( sw:Switch.t -> stream_socket -> Sockaddr.stream -> unit ) -> unit

Datagram Sockets

val datagram_socket : sw:Switch.t -> t -> Sockaddr.datagram -> < datagram_socket ; Flow.close >

datagram_socket ~sw t addr creates a new datagram socket that data can be sent to and received from. The new socket will be closed when sw finishes.

val send : datagram_socket -> Sockaddr.datagram -> Cstruct.t -> unit

send sock addr buf sends the data in buf to the address addr using the the datagram socket sock.

val recv : datagram_socket -> Cstruct.t -> Sockaddr.datagram * int

recv sock buf receives data from the socket sock putting it in buf. The number of bytes received is returned along with the sender address and port. If the buf is too small then excess bytes may be discarded depending on the type of the socket the message is received from.

DNS queries

val getaddrinfo : ?service:string -> t -> string -> Sockaddr.t list

getaddrinfo ?service t node returns a list of IP addresses for node. node is either a domain name or an IP address.

  • parameter service

    is a human friendly textual name for internet services assigned by IANA., eg. 'http', 'https', 'ftp', etc.

    For a more thorough treatment, see getaddrinfo.

val getaddrinfo_stream : ?service:string -> t -> string -> Sockaddr.stream list

getaddrinfo_stream is like getaddrinfo, but filters out non-stream protocols.

val getaddrinfo_datagram : ?service:string -> t -> string -> Sockaddr.datagram list

getaddrinfo_datagram is like getaddrinfo, but filters out non-datagram protocols.

val getnameinfo : t -> Sockaddr.t -> string * string

getnameinfo t sockaddr is (hostname, service) corresponding to sockaddr. hostname is the registered domain name represented by sockaddr. service is the IANA specified textual name of the port specified in sockaddr, e.g. 'ftp', 'http', 'https', etc.

val close : < close : unit.. > -> unit

Closing

close t marks the socket as closed. It can no longer be used after this.