docs: def ping(dest_addr: str, timeout: int = 4, unit: str = "s", src_addr: str = None, ttl: int = 64, seq: int = 0, size: int = 56) -> float or None:
      """
      Send one ping to destination address with the given timeout.
  
      Args:
          dest_addr: The destination address, can be an IP address or a domain name. Ex. "192.168.1.1"/"example.com"
          timeout: Timeout in seconds. Default is 4s, same as Windows CMD. (default 4)
          unit: The unit of returned value. "s" for seconds, "ms" for milliseconds. (default "s")
          src_addr: The IP address to ping from. This is for multi-interface clients. Ex. "192.168.1.20". (default None)
          ttl: The Time-To-Live of the outgoing packet. Default is 64, same as in Linux and macOS. (default 64)
          seq: ICMP packet sequence, usually increases from 0 in the same process. (default 0)
          size: The ICMP packet payload size in bytes. Default is 56, same as in macOS. (default 56)
  
      Returns:
          The delay in seconds/milliseconds or None on timeout.
  
      Raises:
          PingError: Any PingError will raise again if `ping3.EXCEPTIONS` is True.
      """
      with socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) as sock:
          sock.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
          if src_addr:
              sock.bind((src_addr, 0))
          icmp_id = threading.current_thread().ident % 0xFFFF
          try:
              send_one_ping(sock=sock, dest_addr=dest_addr, icmp_id=icmp_id, seq=seq, size=size)
              delay = receive_one_ping(sock=sock, icmp_id=icmp_id, seq=seq, timeout=timeout)  # in seconds
          except errors.PingError as e:
              _debug(e)
              if EXCEPTIONS:
                  raise e
              return None
          if delay is None:
              return None
          if unit == "ms":
              delay *= 1000  # in milliseconds
      return delay