Skip to content

Instantly share code, notes, and snippets.

@datanoise
Created December 9, 2013 18:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save datanoise/7878089 to your computer and use it in GitHub Desktop.
Save datanoise/7878089 to your computer and use it in GitHub Desktop.
NTPClient
package main
import (
"fmt"
"net"
"time"
)
func SntpNow(host string) (*time.Time, error) {
raddr, err := net.ResolveUDPAddr("udp", host+":123")
if err != nil {
return nil, err
}
data := make([]byte, 48)
data[0] = 3<<3 | 3
con, err := net.DialUDP("udp", nil, raddr)
if err != nil {
return nil, err
}
defer con.Close()
_, err = con.Write(data)
if err != nil {
return nil, err
}
con.SetDeadline(time.Now().Add(5 * time.Second))
_, err = con.Read(data)
if err != nil {
return nil, err
}
var sec, frac uint64
sec = uint64(data[43]) | uint64(data[42])<<8 | uint64(data[41])<<16 | uint64(data[40])<<24
frac = uint64(data[47]) | uint64(data[46])<<8 | uint64(data[45])<<16 | uint64(data[44])<<24
nsec := sec * 1e9
nsec += (frac * 1e9) >> 32
t := time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC).Add(time.Duration(nsec)).Local()
return &t, nil
}
func main() {
t, err := SntpNow("pool.ntp.org")
if err != nil {
fmt.Printf("ERROR: %v\n", err)
return
}
fmt.Printf("Network time: %v\n", t)
fmt.Printf("System time: %v\n", time.Now())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment