type io_addr = Unix.inet_addr * int
An address for a given context type, usually this will consist of IP address + a TCP/IP or UDP/IP port number, but for some context types it can carry additional information for purposes of cryptographic verification. TODO at least that would be nice in the future. TODO
type ns_addr = [ `TCP | `UDP ] * io_addr
TODO well this is kind of crude; it's a tuple to prevent having to do endless amounts of currying things when implementing context types, and we need to know the protocol used so we can prefix packets for DNS-over-TCP and set correct socket options etc. therefore we can't just use the opaque io_addr
. TODO
create ~nameserver ~timeout stack
creates the state record of the DNS client. We use timeout
(ns) as a cumulative time budget for connect and request timeouts.
The address of a nameserver that is supposed to work with the underlying context, can be used if the user does not want to bother with configuring their own.
val rng : int -> Cstruct.t
rng t
is a random number generator.
val connect : ?nameserver:ns_addr -> t -> (context, [> `Msg of string ]) Stdlib.result io
connect addr
is a new connection (context
) to addr
, or an error.
val send : context -> Cstruct.t -> (unit, [> `Msg of string ]) Stdlib.result io
send context buffer
sends buffer
to the context
upstream.
val recv : context -> (Cstruct.t, [> `Msg of string ]) Stdlib.result io
recv context
tries to read a buffer
from the context
downstream.
val lift : 'a -> 'a io