Beispiel #1
0
    def request(self, host, version=4, port='ntp', timeout=5):
        """
        Query a SNTP server.

        :param host: server name/address
        :param version: SNTP version to use
        :param port: server port
        :param timeout: timeout on socket operations
        :returns: NTPStats object
        """
        # lookup server address
        addrinfo = socket.getaddrinfo(host, port)[0]
        sockaddr = addrinfo[4]

        # create the socket
        # print(sockaddr)
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        try:
            s.settimeout(timeout)

            # create the request packet - mode 3 is client
            query_packet = NTPPacket(mode=3, version=version,
                                     tx_timestamp=ntp_packet.system_to_ntp_time(time.time()))

            # send the request
            s.sendto(query_packet.to_data(), sockaddr)

            # wait for the response - check the source address
            src_addr = None,
            while src_addr[0] != sockaddr[0]:
                response_packet, src_addr = s.recvfrom(256)

            # build the destination timestamp
            dest_timestamp = ntp_packet.system_to_ntp_time(time.time())
        except socket.timeout:
            raise NTPException("No response received from %s." % host)
        finally:
            s.close()

        # construct corresponding packet
        sntp_packet = NTPPacket()
        sntp_packet.from_data(response_packet)
        sntp_packet.dest_timestamp = dest_timestamp

        print("Offset: ", (((sntp_packet.recv_timestamp - sntp_packet.orig_timestamp) +
                            (sntp_packet.tx_timestamp - sntp_packet.dest_timestamp)) / 2))
        print("Round trip: ", ((sntp_packet.dest_timestamp - sntp_packet.orig_timestamp) -
                               (sntp_packet.tx_timestamp - sntp_packet.recv_timestamp)))

        return sntp_packet