Advertisement
Sabriel

NTP

Jun 27th, 2013
332
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.51 KB | None | 0 0
  1. use IO::Socket;
  2.  
  3. $offset=$ARGV[0];
  4.  
  5. $offset=0 if (!$offset);
  6.  
  7. my $MAXLEN = 1024;
  8. my $sock = IO::Socket::INET->new(
  9. LocalPort => '123',
  10. Proto => 'udp')
  11. or die "socket: $@";
  12. print "NTP server started. Offset=$offset\n";
  13. while ($sock->recv($query, $MAXLEN)) {
  14. my ($port, $ipaddr) = sockaddr_in($sock->peername);
  15. $client = gethostbyaddr($ipaddr, AF_INET);
  16. $client=inet_ntoa($ipaddr);
  17. print "Connection from $client\n";
  18. my @octets=unpack ("B8B8B8B8 B32B32B32 B64B64B64B64",$query);
  19.  
  20. $octets[0]='00'.(substr $octets[0],2,3).'100';
  21. $octets[1]='00000001'; #Stratum
  22. $octets[3]='11111010'; #Precision точность
  23. $octets[4]='00000000000000000000000000000000'; #Root Delay базовая задержка
  24. $octets[5]=$octets[4]; #Root Dispersion маскимальная ошибка из-за нестабильности часов
  25. $octets[6]='01010000010100000101001100000000'; #Reference ID ид эталонных часов
  26. $octets[7]=unpack("B*", pack("N", time()+2208988800)); #когда часы корректировались в последний раз
  27. $octets[8]=$octets[10];#определяет время, когда запрос направлен серверу
  28. $octets[9]=unpack("B*", pack("N", time()+2208988800+$offset));#время, когда запрос прибыл к серверу
  29. $octets[10]=$octets[9];#локальное время, когда послан отклик сервером
  30.  
  31. my $answer=pack ("B8B8B8B8 B32B32B32 B64B64B64B64",@octets);
  32. $sock->send($answer);
  33. }
  34. die "recv: $!";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement