#!/usr/bin/perl use strict; use warnings; #use diagnostics; use Data::Dumper; use IO::Socket::INET; use POSIX qw( CLOCKS_PER_SEC ); use Time::HiRes qw( gettimeofday CLOCK_REALTIME clock_getres ); use constant TRUE => scalar 1; use constant ARGUMENTS => scalar 1; use constant MAXBYTES => scalar 512; use constant MAX_PORT => scalar 65536; use constant MIN_PORT => scalar 1; my $dot = "."; my $rcvSntpPacket; if ( @ARGV > ARGUMENTS ) { print "\nPlease no more than ".ARGUMENTS." argument input!\n"; print "\nCorrect Syntax: perl $0 IP:PORT (e.g. 127.0.0.1:12345)\n"; exit(0); } elsif ( @ARGV < ARGUMENTS ) { print "\nPlease no less than ".ARGUMENTS." argument input!\n"; print "\nCorrect Syntax: perl $0 IP:PORT (e.g. 127.0.0.1:12345)\n"; exit(0); } else { my $info = $ARGV[0]; # User input IP:PORT; my $string = index($info, ':'); if ($string == '-1') { die "Please include ':' in between the IP and Port - ".$info."\n"; } my @input = split( ':' , $info ); die "\nPlease use PORT number between ".MIN_PORT." - ".MAX_PORT."\n\n" if ( ( $input[1] > MAX_PORT ) || ( $input[1] < MIN_PORT ) ); my $client_socket = new IO::Socket::INET ( PeerHost => $input[0], Type => SOCK_DGRAM, PeerPort => $input[1], # Default NTP port 123, due to permission denied switch to client set Proto => 'udp' ) or die "ERROR in Socket Creation: $@\n"; my $Peer_Port = $client_socket->peerport(); my $client_li_vm_mode = '00100011'; # 8 bit my $client_stratum = '0'; # 8 bit my $client_poll = '0'; # 8 bit my $client_precision = '0'; # 8 bit my $client_root_delay = '0'; # 32 bit my $client_dispersion = '0'; # 32 bit my $client_reference_identifier = '0'; # 32 bit my $client_reference_timestamp_sec = '0'; # 32 bit my $client_reference_timestamp_microsec = '0'; # 32 bit my $client_receive_timestamp_sec = '0'; # 32 bit my $client_receive_timestamp_microsec = '0'; # 32 bit my ( $client_transmit_sec , $client_transmit_microsec ) = gettimeofday(); # 64 bit my $client_originate_timestamp_sec = $client_transmit_sec; my $client_originate_timestamp_microsec = $client_transmit_microsec; my @arraySendSntpPacket = ($client_li_vm_mode , $client_stratum , $client_poll , $client_precision , $client_root_delay , $client_dispersion , $client_reference_identifier , $client_reference_timestamp_sec , $client_reference_timestamp_microsec , $client_originate_timestamp_sec , $client_originate_timestamp_microsec , $client_receive_timestamp_sec , $client_receive_timestamp_microsec , $client_transmit_sec , $client_transmit_microsec ); warn Dumper \@arraySendSntpPacket; my $sendSntpPacket = pack "B8 C3 N11", @arraySendSntpPacket; $client_socket->send( $sendSntpPacket ) or die "Client error while send: $!\n"; $client_socket->recv( $rcvSntpPacket , MAXBYTES ) or die "Client error while received: $!\n"; my ( $client_rcv_sec , $client_rcv_microsec ) = gettimeofday(); $client_socket->close(); # Close socket() my @arrayRcvSntpPacket = unpack("B8 C3 N11" , $rcvSntpPacket); my ( $server_li_vm_mode , $server_stratum , $server_poll_interval , $server_precision , $server_root_delay , $server_dispersion , $server_reference_identifier , $server_reference_timestamp_sec , $server_reference_timestamp_microsec , $server_originate_timestamp_sec , $server_originate_timestamp_microsec , $server_rcv_timestamp_sec , $server_rcv_timestamp_microsec , $server_transmit_timestamp_sec , $server_transmit_timestamp_microsec ) = @arrayRcvSntpPacket; warn Dumper \@arrayRcvSntpPacket; } # End of else ARGV provided