sig
  class type endpoint =
    object
      method close : unit
      method fd : Unix.file_descr
      method recv : ?flags:Cf_socket.msg_flags -> string -> int -> int -> int
      method send : ?flags:Cf_socket.msg_flags -> 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, P.ST.tag) Cf_socket.t
      type address = P.AF.address
      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 -> 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
          method private getsockname : Cf_sock_common.T.address
          method getsockopt :
            ('a, P.AF.tag, P.ST.tag) Cf_socket.sockopt -> 'a
          method setsockopt :
            ('b, P.AF.tag, P.ST.tag) Cf_socket.sockopt -> '-> 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 = P.AF.tag
                type address = P.AF.address
                val domain : tag Cf_socket.domain
                val to_sockaddr : address -> tag Cf_socket.sockaddr
                val of_sockaddr : tag Cf_socket.sockaddr -> address
                val unspecified : tag Cf_socket.sockaddr
              end
            module ST :
              sig
                type tag = P.ST.tag
                val socktype : tag Cf_socket.socktype
              end
            val protocol : Cf_socket.protocol
          end
        type t = (P.AF.tag, P.ST.tag) Cf_socket.t
        type address = P.AF.address
        val create : unit -> t
        val createpair : unit -> t * t
        class basic :
          ?sock:t ->
          unit ->
          object
            val socket_ : t
            method private bind : address -> unit
            method close : unit
            method dup : t
            method dup2 : t -> unit
            method fd : Unix.file_descr
            method private getpeername : address
            method private getsockname : address
            method getsockopt :
              ('a, P.AF.tag, P.ST.tag) Cf_socket.sockopt -> 'a
            method setsockopt :
              ('b, P.AF.tag, P.ST.tag) Cf_socket.sockopt -> '-> unit
            method private shutdown : Unix.shutdown_command -> unit
            method socket : t
          end
      end
end