sig
  class type endpoint =
    object
      method close : unit
      method fd : Unix.file_descr
      method recv :
        ?flags:Cf_socket.msg_flags_t -> string -> int -> int -> int
      method send :
        ?flags:Cf_socket.msg_flags_t -> string -> int -> int -> int
      method shutdown : Unix.shutdown_command -> unit
    end
  module type T =
    sig
      module P : Cf_socket.P
      type t = (P.AF.tag_t, P.ST.tag_t) Cf_socket.t
      type address_t = P.AF.address_t
      val create : unit -> Cf_sock_common.T.t
      val createpair : unit -> Cf_sock_common.T.t * Cf_sock_common.T.t
      class basic :
        ?sock:Cf_sock_common.T.t ->
        unit ->
        object
          val socket_ : Cf_sock_common.T.t
          method private bind : Cf_sock_common.T.address_t -> unit
          method close : unit
          method dup : Cf_sock_common.T.t
          method dup2 : Cf_sock_common.T.t -> unit
          method fd : Unix.file_descr
          method private getpeername : Cf_sock_common.T.address_t
          method private getsockname : Cf_sock_common.T.address_t
          method getsockopt :
            ('a, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> 'a
          method setsockopt :
            ('b, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> '-> unit
          method private shutdown : Unix.shutdown_command -> unit
          method socket : Cf_sock_common.T.t
        end
    end
  module Create :
    functor (P : Cf_socket.P->
      sig
        module P :
          sig
            module AF :
              sig
                type tag_t = P.AF.tag_t
                type address_t = P.AF.address_t
                val domain : tag_t Cf_socket.domain_t
                val to_sockaddr : address_t -> tag_t Cf_socket.sockaddr_t
                val of_sockaddr : tag_t Cf_socket.sockaddr_t -> address_t
                val unspecified : tag_t Cf_socket.sockaddr_t
              end
            module ST :
              sig
                type tag_t = P.ST.tag_t
                val socktype : tag_t Cf_socket.socktype_t
              end
            val protocol : Cf_socket.protocol_t
          end
        type t = (P.AF.tag_t, P.ST.tag_t) Cf_socket.t
        type address_t = P.AF.address_t
        val create : unit -> t
        val createpair : unit -> t * t
        class basic :
          ?sock:t ->
          unit ->
          object
            val socket_ : t
            method private bind : address_t -> unit
            method close : unit
            method dup : t
            method dup2 : t -> unit
            method fd : Unix.file_descr
            method private getpeername : address_t
            method private getsockname : address_t
            method getsockopt :
              ('a, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> 'a
            method setsockopt :
              ('b, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> '-> unit
            method private shutdown : Unix.shutdown_command -> unit
            method socket : t
          end
      end
end