sig
  type 'a socktype
  type 'a domain
  type protocol
  type 'a sockaddr
  type ('a, -'b, -'c) sockopt
  type ('a, 'b) t
  type msg_flags = {
    msg_oob : bool;
    msg_peek : bool;
    msg_dontroute : bool;
    msg_eor : bool;
    msg_trunc : bool;
    msg_ctrunc : bool;
    msg_waitall : bool;
    msg_dontwait : bool;
  }
  module type AF =
    sig
      type tag
      type address
      val domain : Cf_socket.AF.tag Cf_socket.domain
      val to_sockaddr :
        Cf_socket.AF.address -> Cf_socket.AF.tag Cf_socket.sockaddr
      val of_sockaddr :
        Cf_socket.AF.tag Cf_socket.sockaddr -> Cf_socket.AF.address
      val unspecified : Cf_socket.AF.tag Cf_socket.sockaddr
    end
  module type ST =
    sig type tag val socktype : Cf_socket.ST.tag Cf_socket.socktype end
  module type P =
    sig module AF : AF module ST : ST val protocol : Cf_socket.protocol end
  module SOCK_STREAM :
    sig type tag = [ `SOCK_STREAM ] val socktype : tag socktype end
  module SOCK_DGRAM :
    sig type tag = [ `SOCK_DGRAM ] val socktype : tag socktype end
  val msg_flags_none : Cf_socket.msg_flags
  val create :
    'Cf_socket.domain ->
    'Cf_socket.socktype -> Cf_socket.protocol -> ('a, 'b) Cf_socket.t
  val createpair :
    'Cf_socket.domain ->
    'Cf_socket.socktype ->
    Cf_socket.protocol -> ('a, 'b) Cf_socket.t * ('a, 'b) Cf_socket.t
  val to_unix_file_descr : ('a, 'b) Cf_socket.t -> Unix.file_descr
  val domain_of_sockaddr : 'Cf_socket.sockaddr -> 'Cf_socket.domain
  val dup : ('a, 'b) Cf_socket.t -> ('a, 'b) Cf_socket.t
  val dup2 : ('a, 'b) Cf_socket.t -> ('a, 'b) Cf_socket.t -> unit
  val getsockname : ('a, 'b) Cf_socket.t -> 'Cf_socket.sockaddr
  val getpeername : ('a, 'b) Cf_socket.t -> 'Cf_socket.sockaddr
  val bind : ('a, 'b) Cf_socket.t -> 'Cf_socket.sockaddr -> unit
  val connect : ('a, 'b) Cf_socket.t -> 'Cf_socket.sockaddr -> unit
  val listen :
    ('a, [< `SOCK_SEQPACKET | `SOCK_STREAM ]) Cf_socket.t -> int -> unit
  val accept :
    ('a, [ `SOCK_STREAM ]) Cf_socket.t ->
    ('a, [ `SOCK_STREAM ]) Cf_socket.t * 'Cf_socket.sockaddr
  val shutdown : ('a, 'b) Cf_socket.t -> Unix.shutdown_command -> unit
  val close : ('a, 'b) Cf_socket.t -> unit
  val send :
    ('a, 'b) Cf_socket.t ->
    string -> int -> int -> Cf_socket.msg_flags -> int
  val sendto :
    ('a, [ `SOCK_DGRAM ]) Cf_socket.t ->
    string ->
    int -> int -> Cf_socket.msg_flags -> 'Cf_socket.sockaddr -> int
  val recv :
    ('a, 'b) Cf_socket.t ->
    string -> int -> int -> Cf_socket.msg_flags -> int
  val recvfrom :
    ('a, [ `SOCK_DGRAM ]) Cf_socket.t ->
    string ->
    int -> int -> Cf_socket.msg_flags -> int * 'Cf_socket.sockaddr
  val getsockopt :
    ('a, 'b) Cf_socket.t -> ('c, 'a, 'b) Cf_socket.sockopt -> 'c
  val setsockopt :
    ('a, 'b) Cf_socket.t -> ('c, 'a, 'b) Cf_socket.sockopt -> '-> unit
  val so_debug : (bool, 'a, 'b) Cf_socket.sockopt
  val so_reuseaddr : (bool, 'a, 'b) Cf_socket.sockopt
  val so_reuseport : (bool, 'a, 'b) Cf_socket.sockopt
  val so_keepalive : (bool, 'a, 'b) Cf_socket.sockopt
  val so_dontroute : (bool, 'a, 'b) Cf_socket.sockopt
  val so_linger : (int option, 'a, 'b) Cf_socket.sockopt
  val so_broadcast : (bool, 'a, 'b) Cf_socket.sockopt
  val so_oobinline : (bool, 'a, 'b) Cf_socket.sockopt
  val so_sndbuf : (int, 'a, 'b) Cf_socket.sockopt
  val so_rcvbuf : (int, 'a, 'b) Cf_socket.sockopt
  val so_sndlowat : (int, 'a, 'b) Cf_socket.sockopt
  val so_rcvlowat : (int, 'a, 'b) Cf_socket.sockopt
  val so_sndtimeo : (float, 'a, 'b) Cf_socket.sockopt
  val so_rcvtimeo : (float, 'a, 'b) Cf_socket.sockopt
  val so_error : (unit, 'a, 'b) Cf_socket.sockopt
  val so_nosigpipe : (bool, 'a, 'b) Cf_socket.sockopt
end