TODO:Golang UDP连接简单测试慎用Deadline

TODO:Golang UDP连接简单测试慎用Deadline,第1张

概述TODO:Golang UDP连接简单测试慎用Deadline UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。在网络中它与TC

Todo:Golang UDP连接简单测试慎用Deadline

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

1.Golang UDP服务

package main import ( “fmt” “net” ) func sendResponse(conn *net.UDPConn,addr *net.UDPAddr) { _,err := conn.WritetoUDP([]byte(“From server: Hello I got your mesage “),addr) if err != nil { fmt.Printf(“Couldn’t send response %v”,err) } } func main() { p := make([]byte,2048) addr := net.UDPAddr{ Port: 12345, IP: net.ParseIP(“127.0.0.1”), } ser,err := net.ListenUDP(“udp”,&addr) if err != nil { fmt.Printf(“Some error %vn”,err) return } for { _,remoteaddr,err := ser.ReadFromUDP(p) fmt.Printf(“Read a message from %v %s n”,p) if err != nil { fmt.Printf(“Some error %v”,err) continue } go sendResponse(ser,remoteaddr) } }

2.Golang UDP 客户端

package main import ( “bufio” “fmt” “net” “os” “time” ) func main() { addr,err := net.ResolveUDPAddr(“udp”,“:12345”) if err != nil { fmt.Println(“net.ResolveUDPAddr fail.”,err) os.Exit(1) } socket,err := net.DialUDP(“udp”,nil,addr) if err != nil { fmt.Println(“net.DialUDP fail.”,err) os.Exit(1) } t := time.Now() socket.SetDeadline(t.Add(time.Duration(5 * time.Second))) // socket.SetWriteDeadline(t.Add(time.Duration(5 * time.Second))) // socket.SetReadDeadline(t.Add(time.Duration(5 * time.Second))) defer socket.Close() r := bufio.NewReader(os.Stdin) for { switch line,ok := r.ReadString(‘n’); true { case ok != nil: fmt.Printf(“bye bye!n”) return default: _,err := socket.Write([]byte(line)) if err != nil { fmt.Println(“error send data,err:”,err) return } data := make([]byte,1024) _,remoteAddr,err := socket.ReadFromUDP(data) if err != nil { fmt.Println(“error recv data,err) return } fmt.Printf(“from %s:%sn”,remoteAddr.String(),string(data)) } } }

3.可以把代表拷贝的本地运行测试,Golang的设置方法有三个:SetDeadline,SetWriteDeadline,SetReadDeadline,设置了Deadline是指定时间戳为超时点, *** 作指定时间戳连接就会超时,再次发送包,接受包就会超时会提示I/O timeout

error send data,err: write udp 127.0.0.1:51608->127.0.0.1:12345: I/O timeout

error recv data,err: read udp 127.0.0.1:51608->127.0.0.1:12345: I/O timeout

所以要保持心跳在线就需要不断刷新Deadline的时间戳。本文仅供参考,如果有相应场景,会使用到,^_^。


wxgzh:ludong86 总结

以上是内存溢出为你收集整理的TODO:Golang UDP连接简单测试慎用Deadline全部内容,希望文章能够帮你解决TODO:Golang UDP连接简单测试慎用Deadline所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1281789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存