ntp服务器udp协议,golang实现NTP协议获取服务器时间[通俗易懂]

ntp服务器udp协议,golang实现NTP协议获取服务器时间[通俗易懂]//fileprojectmain.gopackagemainimport(“encoding/binary””fmt””net””os””os/signal””sync””time”)const(NTP_SERVER_IP=”time.windows.com”/*NTPIP*/NTP_PORT_STR=”123″/*NTP专用端口号字符串*…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

// file project main.go

package main

import (

“encoding/binary”

“fmt”

“net”

“os”

“os/signal”

“sync”

“time”

)

const (

NTP_SERVER_IP = “time.windows.com” /*NTP IP*/

NTP_PORT_STR  = “123”              /*NTP专用端口号字 符串*/

NTP_PCK_LEN   = 48

LI            = 0

VN            = 3

MODE          = 3

STRATUM       = 0

POLL          = 4

PREC          = -6

JAN_1970      = 0x83aa7e80 /* 1900年~1970年之间的时间秒数 */

)

func NTPFRAC(x int64) int64 {

return (4294*(x) + ((1981 * (x)) >> 11))

}

func USEC(x int64) int64 {

return (((x) >> 12) – 759*((((x)>>10)+32768)>>16))

}

type ntp_time struct {

coarse uint32

fine   uint32

}

type ntp_packet struct {

leap_ver_mode        byte

startum              byte

poll                 byte

precision            byte

root_delay           int

root_dispersion      int

reference_identifier int

reference_timestamp  ntp_time

originage_timestamp  ntp_time

receive_timestamp    ntp_time

transmit_timestamp   ntp_time

}

var protocol []byte

func construct_packet() ([]byte, int) {

reqData := make([]byte, NTP_PCK_LEN)

//设置16字节的包头

head := (LI << 30) | (VN << 27) | (MODE << 24) | (STRATUM << 16) | (POLL << 8) | (PREC & 0xff)

binary.BigEndian.PutUint32(reqData[0:4], uint32(head))

//设置Root Delay、Root Dispersion和Reference Indentifier

binary.BigEndian.PutUint32(reqData[4:8], uint32(1<<16))

binary.BigEndian.PutUint32(reqData[8:12], uint32(1<<16))

binary.BigEndian.PutUint32(reqData[12:16], uint32(1<<16))

//设置Timestamp部分

timeOri := JAN_1970 + time.Now().Unix()

//设置Transmit Timestamp coarse

binary.BigEndian.PutUint32(reqData[40:44], uint32(timeOri))

//设置Transmit Timestamp fine

binary.BigEndian.PutUint32(reqData[44:48], uint32(NTPFRAC(timeOri)))

return reqData, NTP_PCK_LEN

}

func main() {

protocol = make([]byte, 32)

// Resolve address

fmt.Println(“ntp begin NTC…..”)

udpAddr, errData := net.ResolveUDPAddr(“udp”, NTP_SERVER_IP+”:”+NTP_PORT_STR)

if nil != errData {

fmt.Printf(“ntp connect err: %v\n”, errData)

return

}

fmt.Println(“ntp after ResolveTCPAddr…..: “, udpAddr)

conn, err := net.DialUDP(“udp”, nil, udpAddr)

if nil != err {

fmt.Printf(“ntp net connect error: %v\n”, err)

return

}

fmt.Println(“ntp after DialUDP…..”)

data, packet_len := construct_packet()

if packet_len == 0 {

fmt.Println(“ntp packet len is 0”)

return

}

fmt.Println(“ntp begin send: %v, data: %v”, packet_len, data)

conn.SetWriteDeadline(time.Now().Add(time.Second))

size, err := conn.Write(data)

if nil != err {

fmt.Printf(“ntp write data error: %v\n”, err)

return

} else {

fmt.Printf(“ntp write len: %v\n”, size)

}

fmt.Println(“after send”)

recvBody := make([]byte, 4096)

wait := &sync.WaitGroup{}

wait.Add(1)

go func() {

defer wait.Done()

for {

fmt.Println(“ntp begin read”)

conn.SetReadDeadline(time.Now().Add(time.Second))

size, remoteAddr, err := conn.ReadFromUDP(recvBody)

if nil != err {

fmt.Printf(“ntp read data error: %v\n”, err)

} else {

fmt.Printf(“ntp read len: %v\n”, size)

}

fmt.Println(“ntp after read, remoteAddr: %v\n”, remoteAddr.String(), recvBody[:size])

break

}

}()

wait.Wait()

var dataStru ntp_packet

dataStru.transmit_timestamp.coarse = binary.BigEndian.Uint32(recvBody[40:44]) – JAN_1970

dataStru.transmit_timestamp.fine = uint32(USEC(int64(binary.BigEndian.Uint32(recvBody[44:48]))))

fmt.Println(dataStru)

//等待退出

c := make(chan os.Signal, 1)

signal.Notify(c, os.Interrupt, os.Kill)

fmt.Println(“ntp Receive ctrl-c”)

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183733.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月31日 下午6:00
下一篇 2022年8月31日 下午6:16


相关推荐

  • c++学生管理系统源代码_学校运营管理系统

    c++学生管理系统源代码_学校运营管理系统C#学员管理系统C#学员管理系统是在控制台输出的项目,和OOP学员管理系统相似。①创建一个学员的实体类Student,实现其构造方法和封装:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;///<summary>///实体类///</sum…

    2026年2月4日
    7
  • fastai教程_euleros安装教程

    fastai教程_euleros安装教程从fast.ai学到的十大技巧:如何在几周内上手顶级算法https://www.colabug.com/3887239.htmlfastai系列教程(二)-快速入门MNIST示例https://www.pytorchtutorial.com/fastai-tutorial-2-overview-mnist/…

    2025年10月3日
    5
  • 分布式熔断机制_服务器熔断是什么意思啊

    分布式熔断机制_服务器熔断是什么意思啊#服务熔断-“熔断器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器(hystrix)的故障监控,某个异常条件被触发,直接熔断整个服务。向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,就保证了服务调用方的线程不会被长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。如果目标服务情况好转则恢复调用。服务熔断是解决服务雪崩的重要手段。#服务熔断图示…

    2022年8月31日
    4
  • org.apache.subversion.javahl.ClientException: Item is not readable 解决办法

    org.apache.subversion.javahl.ClientException: Item is not readable 解决办法

    2022年3月13日
    86
  • Echarts中国地图的显示

    Echarts中国地图的显示话不多说 直接上代码很多人都说 china js 文件不好找 直接奉上地址 自行下载 http echarts baidu com gallery vendors echarts map js china js 以下是完整示例代码 lt htmllang en gt lt head gt lt metacharset UTF 8 gt lt met

    2026年3月26日
    2
  • Navicat 15.0.23激活码[在线序列号][通俗易懂]

    Navicat 15.0.23激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    145

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号