sig
  module 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
  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