functor
  (P : sig
         module AF : Cf_socket.AF
         module ST :
           sig
             type tag_t = [ `SOCK_STREAM ]
             val socktype : tag_t Cf_socket.socktype_t
           end
         val protocol : Cf_socket.protocol_t
       end->
  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 = [ `SOCK_STREAM ]
            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
    class initiator :
      ?sock:t ->
      ?src:address_t ->
      address_t ->
      object
        val socket_ : t
        method private bind : address_t -> unit
        method close : unit
        method connect : unit
        method dup : t
        method dup2 : t -> unit
        method fd : Unix.file_descr
        method private getpeername : address_t
        method 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
    class listener :
      ?sock:t ->
      address_t ->
      object
        val socket_ : t
        method accept : t * address_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 getsockname : address_t
        method getsockopt :
          ('a, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> 'a
        method listen : int -> unit
        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
    class endpoint :
      t ->
      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 getpeername : address_t
        method getsockname : address_t
        method getsockopt :
          ('a, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> 'a
        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 setsockopt :
          ('b, P.AF.tag_t, P.ST.tag_t) Cf_socket.sockopt_t -> '-> unit
        method shutdown : Unix.shutdown_command -> unit
        method socket : t
      end
  end