docs: def do(self):
          """
          Send one ICMP ECHO_REQUEST and receive the response until self.timeout.
          """
          try: # One could use UDP here, but it's obscure
              current_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp"))
          except socket.error as (errno, msg):
              if errno == 1:
                  # Operation not permitted - Add more information to traceback
                  etype, evalue, etb = sys.exc_info()
                  evalue = etype(
                      "%s - Note that ICMP messages can only be send from processes running as root." % evalue
                  )
                  raise etype, evalue, etb
              raise # raise the original error
  
          send_time = self.send_one_ping(current_socket)
          if send_time == None:
              return
          self.send_count += 1
  
          receive_time, packet_size, ip, ip_header, icmp_header = self.receive_one_ping(current_socket)
          current_socket.close()
  
          if receive_time:
              self.receive_count += 1
              delay = (receive_time - send_time) * 1000.0
              self.total_time += delay
              if self.min_time > delay:
                  self.min_time = delay
              if self.max_time < delay:
                  self.max_time = delay
  
              return PingSuccess(delay, ip, packet_size, ip_header, icmp_header)
          else:
              return PingTimeout(self.destination)