sig
  module ST :
    sig
      type tag_t = [ `SOCK_DGRAM ]
      val socktype : tag_t Cf_socket.socktype_t
    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 -> 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 endpoint :
        t ->
        object
          val socket_ : t
          method private bind : address_t -> unit
          method close : unit
          method connect : address_t -> 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 recvfrom :
            ?flags:Cf_socket.msg_flags_t ->
            string -> int -> int -> int * address_t
          method send :
            ?flags:Cf_socket.msg_flags_t -> string -> int -> int -> int
          method sendto :
            ?flags:Cf_socket.msg_flags_t ->
            string -> int -> int -> address_t -> 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
  module Create :
    functor
      (P : sig
             module AF : Cf_socket.AF
             module ST :
               sig
                 type tag_t = [ `SOCK_DGRAM ]
                 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_DGRAM ]
                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 endpoint :
          t ->
          object
            val socket_ : t
            method private bind : address_t -> unit
            method close : unit
            method connect : address_t -> 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 recvfrom :
              ?flags:Cf_socket.msg_flags_t ->
              string -> int -> int -> int * address_t
            method send :
              ?flags:Cf_socket.msg_flags_t -> string -> int -> int -> int
            method sendto :
              ?flags:Cf_socket.msg_flags_t ->
              string -> int -> int -> address_t -> 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
end