当前位置: 首页 > news >正文

建什么网站能百度收录经典网站建设案例

建什么网站能百度收录,经典网站建设案例,0建设营销型网站步骤介绍,wordpress分类目录 插件NTP服务介绍 NTP服务器【Network Time Protocol#xff08;NTP#xff09;】是用来使计算机时间同步化的一种协议。 应用场景说明 为了确保封闭局域网内多个服务器的时间同步#xff0c;我们计划部署一个网络时间同步服务器#xff08;NTP服务器#xff09;。这一角色将…NTP服务介绍 NTP服务器【Network Time ProtocolNTP】是用来使计算机时间同步化的一种协议。 应用场景说明 为了确保封闭局域网内多个服务器的时间同步我们计划部署一个网络时间同步服务器NTP服务器。这一角色将由一台个人笔记本电脑承担该笔记本将连接到局域网中并以其当前时间为基准。我们将利用这台笔记本电脑作为NTP服务器对局域网内的多个运行CentOS 8的服务器进行时间校准以保证系统时间的一致性和准确性。 NTP协议 NTP通信协议的传输层协议是UDPNTP通信协议的应用层协议是NTP NTP报文说明 NTP的报文是48字节 第1个字节可以理解为简易的报文头这8个bit包含Leap Indicator、NTP Version、Mode a LI 占用2个bit b VN 占用3个bit笔者编写的服务器设置为版本v4.0 c Mode 占用3个bitntp server时为4ntp client时为3第2个字节为 Peer Clock Stratum第3个字节为 Peer Polling Interval第4个字节为 Peer Clock Precision第5 - 8字节为 Root Delay第9 - 12字节为 Root Dispersion第13- 16字节为 Reference Identifier第17 - 24字节为 Reference Timestamp 参考时间戳第25 - 32字节为 Originate Timestamp 起始时间戳第33 - 40字节为 Receive Timestamp 接收时间戳第 41 - 48字节 Transmit Timestamp 传输时间戳 根据NTP报文编码实现Go语言的结构体 type NtpPacket struct {/*LI: 2bit 00 Leap Indicator(0)VN: 3bit 100 NTP Version(4)Mode: 3bit 100 Mode: server(4), client(3)*/Header uint8 // 报文头: 包含LI、VN、ModeStratum uint8 // Peer Clock Stratum: primary reference (1)Poll uint8 // Peer Polling Interval: invalid (0)Precision uint8 // Peer Clock Precision: 0.000000 secondsRootDelay uint32 // Root DelayRootDisp uint32 // Root DispersionRefID uint32 // Reference IdentifierRefTS uint64 // Reference Timestamp 参考时间戳OrigTS uint64 // Originate Timestamp 起始时间戳RecvTS uint64 // Receive Timestamp 接收时间戳TransTS uint64 // Transmit Timestamp 传输时间戳 }NTP服务器的源码 ntpsrv.go package mainimport (hldlog NTPServer/log4goencoding/binaryfmtlognetsynctime )const (STANDARD_PACKET_SIZE 48 // 标准NTP的报文大小 )type NTPServer struct {srvAddress stringconn *net.UDPConnwait sync.WaitGroupntpPack NtpPacket // NTP协议报文requestCount uint64 // 请求计数 }type NtpPacket struct {/*LI: 2bit 00 Leap Indicator(0)VN: 3bit 100 NTP Version(4)Mode: 3bit 100 Mode: server(4), client(3)*/Header uint8 // 报文头: 包含LI、VN、ModeStratum uint8 // Peer Clock Stratum: primary reference (1)Poll uint8 // Peer Polling Interval: invalid (0)Precision uint8 // Peer Clock Precision: 0.000000 secondsRootDelay uint32 // Root DelayRootDisp uint32 // Root DispersionRefID uint32 // Reference IdentifierRefTS uint64 // Reference Timestamp 参考时间戳OrigTS uint64 // Originate Timestamp 起始时间戳RecvTS uint64 // Receive Timestamp 接收时间戳TransTS uint64 // Transmit Timestamp 传输时间戳 }func (srv *NTPServer) NewNtpPacket() *NtpPacket {// 初始化Header字段header : uint8(0)header | (0 6) // LI: 2bit 00header | (4 3) // VN: 3bit 100header | (4 0) // Mode: 3bit 100// 创建新的NtpPacket实例packet : NtpPacket{Header: header,Stratum: 0x01,Poll: 0x00,Precision: 0x00,RootDelay: 0,RootDisp: 0,RefID: 0,RefTS: 0,OrigTS: 0,RecvTS: 0,TransTS: 0,}return packet }func (pack *NtpPacket) SetTimestamp(timestamp time.Time, field string) {ntpTime : ToNTPTime(timestamp)switch field {case RefTS:pack.RefTS ntpTimecase OrigTS:pack.OrigTS ntpTimecase RecvTS:pack.RecvTS ntpTimecase TransTS:pack.TransTS ntpTime} }// toNTPTime 将Unix时间转换为NTP时间 func ToNTPTime(t time.Time) uint64 {seconds : uint32(t.Unix()) 2208988800 // NTP时间从1900年开始计算fraction : uint32(float64(t.Nanosecond()) * (1 32) / 1e9)return uint64(seconds)32 | uint64(fraction) }func NewNTPServer(srvAddr string) *NTPServer {return NTPServer{srvAddress: srvAddr} }// 启动NTP服务器 func (srv *NTPServer) Start() error {addr, err : net.ResolveUDPAddr(udp, srv.srvAddress)if err ! nil {return err}hldlog.Info(fmt.Sprintf(%s:%d, addr.IP.String(), addr.Port))conn, err : net.ListenUDP(udp, addr)if err ! nil {return err}srv.wait.Add(1)srv.conn conngo RecvMsg(srv)return nil }// 关闭NTP服务器 func (srv *NTPServer) Stop() {srv.conn.Close()srv.wait.Wait() }// 接收数据 func RecvMsg(srv *NTPServer) {defer srv.wait.Done()buffer : make([]byte, 2*1024)for {n, remoteAddr, err : srv.conn.ReadFromUDP(buffer[0:])if err ! nil {fmt.Println(ReadFromUDP error:, err)return}hldlog.Info(fmt.Sprintf([Recv] %d bytes from %s, n, remoteAddr.String()))if n ! STANDARD_PACKET_SIZE {continue}// 接收到NTP客户端消息的时间recvMsgTime : time.Now().UTC()recvHexString : BytesToHex(buffer[:n])hldlog.Info(fmt.Sprintf([Recv] %s, recvHexString))udpPacket, err : ParseUDPPacket(buffer[:n])if err ! nil {log.Printf(Error parsing UDP packet: %v, err)continue}ntpPack : srv.NewNtpPacket()ntpPack.SetTimestamp(time.Now().UTC(), RefTS)ntpPack.OrigTS udpPacket.TransTSntpPack.SetTimestamp(recvMsgTime, RecvTS)ntpPack.SetTimestamp(time.Now().UTC(), TransTS)sendPacket : ntpPack.Serialize()sendLen, err : srv.conn.WriteToUDP(sendPacket, remoteAddr)if err ! nil {log.Println(err.Error())continue}if sendLen 0 {hldlog.Info(fmt.Sprintf([Send] %s, BytesToHex(sendPacket)))}srv.requestCount} }func (pack *NtpPacket) Serialize() []byte {packet : make([]byte, 48)// binary.BigEndian.PutUint32(packet[0:4], pack.Header)packet[0] pack.Headerpacket[1] pack.Stratumpacket[2] pack.Pollpacket[3] pack.Precisionbinary.BigEndian.PutUint32(packet[4:8], pack.RootDelay)binary.BigEndian.PutUint32(packet[8:12], pack.RootDisp)binary.BigEndian.PutUint32(packet[12:16], pack.RefID)binary.BigEndian.PutUint64(packet[16:24], pack.RefTS)binary.BigEndian.PutUint64(packet[24:32], pack.OrigTS)binary.BigEndian.PutUint64(packet[32:40], pack.RecvTS)binary.BigEndian.PutUint64(packet[40:48], pack.TransTS)return packet }// BytesToHex 将字节数组转换为16进制字符串 func BytesToHex(data []byte) string {hexString : make([]byte, 3*len(data)-1)for i, b : range data {high : 0123456789ABCDEF[(b 4)]low : 0123456789ABCDEF[(b 0x0F)]hexString[i*3] highhexString[i*31] lowif i len(data)-1 {hexString[i*32] // 每个16进制数据之间加空格}}return string(hexString) }func ParseUDPPacket(buf []byte) (*NtpPacket, error) {if len(buf) STANDARD_PACKET_SIZE { // 最小有效长度为48字节return nil, fmt.Errorf(Invalid UDP packet length: %d, len(buf))}packet : NtpPacket{// Header: binary.BigEndian.Uint32(buf[0:4]),Header: buf[0],Stratum: buf[1],Poll: buf[2],Precision: buf[3],RootDelay: binary.BigEndian.Uint32(buf[4:8]),RootDisp: binary.BigEndian.Uint32(buf[8:12]),RefID: binary.BigEndian.Uint32(buf[12:16]),RefTS: binary.BigEndian.Uint64(buf[16:24]),OrigTS: binary.BigEndian.Uint64(buf[24:32]),RecvTS: binary.BigEndian.Uint64(buf[32:40]),TransTS: binary.BigEndian.Uint64(buf[40:48]),}return packet, nil }main.go package mainimport (hldlog NTPServer/log4gofmtgopkg.in/ini.v1time )type NetAddr struct {IP stringPort string }var LocalHost NetAddr{IP: 0.0.0.0, Port: 60123}func loadConfig() (NetAddr, error) {// 读取INI配置文件iniConf, err : ini.Load(./config/config.ini)if err ! nil {hldlog.Error(fmt.Sprintf(Fail to read INI file: %v, err))return LocalHost, nil}iniSection : iniConf.Section(LocalHost)return NetAddr{IP: iniSection.Key(ip).String(),Port: iniSection.Key(port).String(),}, nil }// 初始化log4go日志库 func init() {hldlog.LoadConfiguration(./config/log.xml, xml) }func main() {hldlog.Info(NTP SERVER Start(48 Bytes))LocalHost, err : loadConfig()if err ! nil {hldlog.Error(fmt.Sprintf(Failed to load configuration: %v, err))}ntpSrv : NewNTPServer(fmt.Sprintf(%s:%s, LocalHost.IP, LocalHost.Port))ntpSrv.Start()for {time.Sleep(60 * time.Second)} }代码细节说明 NTP服务器在回复NTP客户端的消息中其中OrigTS uint64Originate Timestamp 起始时间戳必须是NTP客户端发送来的TransTS uint64Transmit Timestamp 传输时间戳。 验证GoNTPSrv 上述实现的NTP服务已经过Go语言中开源的NTP Client库 https://github.com/beevik/ntp 验证。 UDP数据包 # 客户端发送的数据 23 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 39 1C 79 9E 83 D3 D5 82# 服务器返回的数据 24 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 EA D9 CF EE AD 4D DC 2B 39 1C 79 9E 83 D3 D5 82 EA D9 CF EE AD 4D DC 2B EA D9 CF EE AD 4D DC 2BNTP Client的简单源码 package mainimport (hldlog NTPCli/log4gofmtlogosos/exectimegithub.com/beevik/ntpgopkg.in/ini.v1 )type NetAddr struct {IP stringPort int }var RemoteAddr NetAddr{IP: 0.0.0.0, Port: 60123}func init() {hldlog.LoadConfiguration(./config/log.xml, xml) }func main() {hldlog.Info(NTP CLIENT Start)currTime : time.Now()formattedTime : currTime.Format(2006-01-02 15:04:05.000)hldlog.Info(formattedTime)// 读取INI配置文件iniConf, err : ini.Load(./config/config.ini)if err ! nil {log.Fatalf(Fail to read INI file: %v, err)}remoteSection : iniConf.Section(NTP_SERVER)RemoteAddr.IP remoteSection.Key(ip).String()RemoteAddr.Port, _ remoteSection.Key(port).Int()hldlog.Info(fmt.Sprintf(ntp://%s:%d, RemoteAddr.IP, RemoteAddr.Port))// edu.ntp.org.cn// resp, err : ntp.Time(edu.ntp.org.cn)resp, err : ntp.Time(fmt.Sprintf(%s:%d, RemoteAddr.IP, RemoteAddr.Port))if err ! nil {hldlog.Error(fmt.Sprintf(%v, err))os.Exit(-1)}hldlog.Info(resp.String())localTime : resp.Local()hldlog.Info(localTime.Format(2006-01-02 15:04:05.000))// setTime(localTime)for {time.Sleep(60 * time.Second)} }
http://www.ho-use.cn/article/10822886.html

相关文章:

  • 营销外包网站海淀区seo搜索优化
  • 福州网站推广排名莆田外贸专业建站
  • 西安高端网站开发腾讯云服务器centos做静态网站
  • 免费php外贸网站模板支付平台网站建设
  • 免费刷网站百度关键词秦皇岛做网站的公司
  • 外贸网站建设应该怎样选择语言工商营业执照查询网
  • 义网站建设推荐郑国华网页设计个人简历模板
  • 好的网站建设技术做ppt兼职的网站
  • 济南建设官方网站wordpress主题邮件模板下载失败
  • 网站title重复的后果公司域名更改 网站怎么做提示
  • python做网站开发巩义关键词优化公司电话
  • 网站里的专题页面学校网站空间建设情况
  • 中文域名.网站教师专用ppt模板免费下载
  • 网站生成静态页面工具网站快速建设入门教程
  • 手机网站js电话悬浮wordpress转载视频
  • 网站建设高网络搜索关键词
  • 网站后端技术语言凡科建站网页版
  • 海珠做网站公深圳网站建设品牌
  • 网站建站安全需求手机网站seo
  • 网站加网页wordpress 密码解密
  • 如何建立一个网站支持chrome企业信息填报官网
  • qq群网站推广oa办公系统软件多少钱
  • 上海最好的网站设计公司网站定制设计网页价格多少钱
  • 海口网站开发软件技术就业方向
  • 十大免费不用收费的网站中国平安保险公司官网首页
  • 乐清网站建设哪家好成都德阳网站建设
  • 中山专业手机网站建设重庆网红景点有哪些
  • 门户网站建设请示报告营销型网站建设公司排名
  • 高邮建设银行网站专题定制网站建设
  • 网站根目录表示商城app有哪些