sig
  module P :
    sig
      module AF :
        sig
          type tag = [ `AF_INET ]
          type address = Cf_ip4_addr.opaque Cf_ip4_addr.t * int
          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 = [ `SOCK_STREAM ]
          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
  class initiator :
    ?sock:t ->
    ?src:address ->
    address ->
    object
      val socket_ : t
      method private bind : address -> unit
      method close : unit
      method connect : unit
      method dup : t
      method dup2 : t -> unit
      method fd : Unix.file_descr
      method private getpeername : address
      method 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
  class listener :
    ?sock:t ->
    address ->
    object
      val socket_ : t
      method accept : t * address
      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 getsockname : address
      method getsockopt : ('a, P.AF.tag, P.ST.tag) Cf_socket.sockopt -> 'a
      method listen : int -> unit
      method setsockopt :
        ('b, P.AF.tag, P.ST.tag) Cf_socket.sockopt -> '-> unit
      method private shutdown : Unix.shutdown_command -> unit
      method socket : t
    end
  class endpoint :
    t ->
    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 getpeername : address
      method getsockname : address
      method getsockopt : ('a, P.AF.tag, P.ST.tag) Cf_socket.sockopt -> 'a
      method recv : ?flags:Cf_socket.msg_flags -> string -> int -> int -> int
      method send : ?flags:Cf_socket.msg_flags -> string -> int -> int -> int
      method setsockopt :
        ('b, P.AF.tag, P.ST.tag) Cf_socket.sockopt -> '-> unit
      method shutdown : Unix.shutdown_command -> unit
      method socket : t
    end
end