sig
  type 'a socktype_t
  type 'a domain_t
  type protocol_t
  type 'a sockaddr_t
  type ('a, -'b, -'c) sockopt_t
  type (+'a, +'b) t
  type msg_flags_t = {
    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_t
      type address_t
      val domain : Cf_socket.AF.tag_t Cf_socket.domain_t
      val to_sockaddr :
        Cf_socket.AF.address_t -> Cf_socket.AF.tag_t Cf_socket.sockaddr_t
      val of_sockaddr :
        Cf_socket.AF.tag_t Cf_socket.sockaddr_t -> Cf_socket.AF.address_t
      val unspecified : Cf_socket.AF.tag_t Cf_socket.sockaddr_t
    end
  module type ST =
    sig type tag_t val socktype : Cf_socket.ST.tag_t Cf_socket.socktype_t end
  module type P =
    sig module AF : AF module ST : ST val protocol : Cf_socket.protocol_t end
  val msg_flags_none : Cf_socket.msg_flags_t
  val create :
    'Cf_socket.domain_t ->
    'Cf_socket.socktype_t -> Cf_socket.protocol_t -> ('a, 'b) Cf_socket.t
  val createpair :
    'Cf_socket.domain_t ->
    'Cf_socket.socktype_t ->
    Cf_socket.protocol_t -> ('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_t -> 'Cf_socket.domain_t
  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_t
  val getpeername : ('a, 'b) Cf_socket.t -> 'Cf_socket.sockaddr_t
  val bind : ('a, 'b) Cf_socket.t -> 'Cf_socket.sockaddr_t -> unit
  val connect : ('a, 'b) Cf_socket.t -> 'Cf_socket.sockaddr_t -> 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_t
  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_t -> int
  val sendto :
    ('a, [ `SOCK_DGRAM ]) Cf_socket.t ->
    string ->
    int -> int -> Cf_socket.msg_flags_t -> 'Cf_socket.sockaddr_t -> int
  val recv :
    ('a, 'b) Cf_socket.t ->
    string -> int -> int -> Cf_socket.msg_flags_t -> int
  val recvfrom :
    ('a, [ `SOCK_DGRAM ]) Cf_socket.t ->
    string ->
    int -> int -> Cf_socket.msg_flags_t -> int * 'Cf_socket.sockaddr_t
  val getsockopt :
    ('a, 'b) Cf_socket.t -> ('c, 'a, 'b) Cf_socket.sockopt_t -> 'c
  val setsockopt :
    ('a, 'b) Cf_socket.t -> ('c, 'a, 'b) Cf_socket.sockopt_t -> '-> unit
  val so_debug : (bool, 'a, 'b) Cf_socket.sockopt_t
  val so_reuseaddr : (bool, 'a, 'b) Cf_socket.sockopt_t
  val so_reuseport : (bool, 'a, 'b) Cf_socket.sockopt_t
  val so_keepalive : (bool, 'a, 'b) Cf_socket.sockopt_t
  val so_dontroute : (bool, 'a, 'b) Cf_socket.sockopt_t
  val so_linger : (int option, 'a, 'b) Cf_socket.sockopt_t
  val so_broadcast : (bool, 'a, 'b) Cf_socket.sockopt_t
  val so_oobinline : (bool, 'a, 'b) Cf_socket.sockopt_t
  val so_sndbuf : (int, 'a, 'b) Cf_socket.sockopt_t
  val so_rcvbuf : (int, 'a, 'b) Cf_socket.sockopt_t
  val so_sndlowat : (int, 'a, 'b) Cf_socket.sockopt_t
  val so_rcvlowat : (int, 'a, 'b) Cf_socket.sockopt_t
  val so_sndtimeo : (float, 'a, 'b) Cf_socket.sockopt_t
  val so_rcvtimeo : (float, 'a, 'b) Cf_socket.sockopt_t
  val so_error : (unit, 'a, 'b) Cf_socket.sockopt_t
  val so_nosigpipe : (bool, 'a, 'b) Cf_socket.sockopt_t
end