gontpd.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package tcpserver
  2. import (
  3. "encoding/binary"
  4. // "flag"
  5. "fmt"
  6. "log"
  7. "net"
  8. "time"
  9. )
  10. const ntpEpochOffset = 2208988800
  11. type packet struct {
  12. Settings uint8
  13. Stratum uint8
  14. Poll int8
  15. Precision int8
  16. RootDelay uint32
  17. RootDispersion uint32
  18. ReferenceID uint32
  19. RefTimeSec uint32
  20. RefTimeFrac uint32
  21. OrigTimeSec uint32
  22. OrigTimeFrac uint32
  23. RxTimeSec uint32
  24. RxTimeFrac uint32
  25. TxTimeSec uint32
  26. TxTimeFrac uint32
  27. }
  28. func GoNtpd() {
  29. //var host string
  30. //flag.StringVar(&host, "e", "ntp.api.bz", "NTP host") //"182.92.12.11:123"
  31. //flag.Parse()
  32. conn, err := net.Dial("udp", "ntp.api.bz:123") //host)
  33. if err != nil {
  34. log.Fatalf("failed to connect: %v", err)
  35. }
  36. defer conn.Close()
  37. if err := conn.SetDeadline(time.Now().Add(15 * time.Second)); err != nil {
  38. log.Fatalf("failed to set deadline: %v", err)
  39. }
  40. req := &packet{Settings: 0x1B}
  41. if err := binary.Write(conn, binary.BigEndian, req); err != nil {
  42. log.Fatalf("failed to send request: %v", err)
  43. }
  44. rsp := &packet{}
  45. if err := binary.Read(conn, binary.BigEndian, rsp); err != nil {
  46. log.Fatalf("failed to read server response: %v", err)
  47. }
  48. secs := float64(rsp.TxTimeSec) - ntpEpochOffset
  49. nanos := (int64(rsp.TxTimeFrac) * 1e9) >> 32
  50. showtime := time.Unix(int64(secs), nanos)
  51. fmt.Printf("%v\n", showtime)
  52. fmt.Println("now:", int64(secs))
  53. }