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服务

  1. package main
  2. import (
  3. “fmt”
  4. “net”
  5. )
  6. func sendResponse(conn *net.UDPConn, addr *net.UDPAddr) {
  7. _, err := conn.WriteToUDP([]byte(“From server: Hello I got your mesage “), addr)
  8. if err != nil {
  9. fmt.Printf(“Couldn’t send response %v”, err)
  10. }
  11. }
  12. func main() {
  13. p := make([]byte, 2048)
  14. addr := net.UDPAddr{
  15. Port: 12345,
  16. IP: net.ParseIP(“127.0.0.1”),
  17. }
  18. ser, err := net.ListenUDP(“udp”, &addr)
  19. if err != nil {
  20. fmt.Printf(“Some error %vn”, err)
  21. return
  22. }
  23. for {
  24. _,     remoteaddr, err := ser.ReadFromUDP(p)
  25. fmt.Printf(“Read a message from %v %s n”, remoteaddr, p)
  26. if err != nil {
  27. fmt.Printf(“Some error %v”, err)
  28. continue
  29. }
  30. go sendResponse(ser, remoteaddr)
  31. }
  32. }

2.Golang UDP 客户端

  1. package main
  2. import (
  3. “bufio”
  4. “fmt”
  5. “net”
  6. “os”
  7. “time”
  8. )
  9. func main() {
  10. addr, err := net.ResolveUDPAddr(“udp”, “:12345”)
  11. if err != nil {
  12. fmt.Println(“net.ResolveUDPAddr fail.”, err)
  13. os.Exit(1)
  14. }
  15. socket, err := net.DialUDP(“udp”, nil, addr)
  16. if err != nil {
  17. fmt.Println(“net.DialUDP fail.”, err)
  18. os.Exit(1)
  19. }
  20. t := time.Now()
  21. socket.SetDeadline(t.Add(time.Duration(5 * time.Second)))
  22. // socket.SetWriteDeadline(t.Add(time.Duration(5 * time.Second)))
  23. // socket.SetReadDeadline(t.Add(time.Duration(5 * time.Second)))
  24. defer socket.Close()
  25. r := bufio.NewReader(os.Stdin)
  26. for {
  27. switch line, ok := r.ReadString(‘n’); true {
  28. case ok != nil:
  29. fmt.Printf(“bye bye!n”)
  30. return
  31. default:
  32. _, err := socket.Write([]byte(line))
  33. if err != nil {
  34. fmt.Println(“error send data,err:”, err)
  35. return
  36. }
  37. data := make([]byte, 1024)
  38. _, remoteAddr, err := socket.ReadFromUDP(data)
  39. if err != nil {
  40. fmt.Println(“error recv data,err:”, err)
  41. return
  42. }
  43. fmt.Printf(“from %s:%sn”, remoteAddr.String(), string(data))
  44. }
  45. }
  46. }

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的更多相关文章

  1. 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制

    第三期 · 使用 Vue 3.1 + TailWind.CSS + Axios + Golang + Sqlite3 实现简单评论机制 效果图 CommentArea.vue 我们需要借助js的Dat ...

  2. NetworkComms V3 之支持TCP连接和UDP连接

    NetworkComms V3 无缝的支持TCP连接和UDP连接. 您可以很容易的创建这两种连接 //创建一个连接信息对象 ConnectionInfo connInfo = ); //创建一个TCP ...

  3. .NET Socket TCP 50W在线连接交互测试

    在平常的交流中经常有人问.net socket能支持多少在线?和C++或linux下比起来应该差很远吧?其实产生这样问题的主要原因是.net很少人去做这方面的测试,而在linux下则经常听到什么100 ...

  4. java,UDP协议简单实现

    //UDP协议简单实现-----Serverpackage UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; i ...

  5. ORACLE 数据库简单测试

    ORACLE 数据库简单测试 操作系统:Windows 7 – ORACLE:oracle database 10.2.0.4 一.目的 测试 启动监听程序.数据库  非同一个用户的情况,用户是否可以 ...

  6. struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)

    为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...

  7. golang实现的简单优先队列

    下面是golang实现的简单优先队列,参考信息可以查看https://golang.org/pkg/container/heap/或者https://golang.google.cn/pkg/cont ...

  8. [20190211]简单测试端口是否打开.txt

    [20190211]简单测试端口是否打开.txt --//昨天看一个链接,提到如果判断一个端口是否打开可以简单执行如下:--//参考链接:https://dba010.com/2019/02/04/c ...

  9. RAMPS1.4 3D打印控制板:软件下载\连接\安装\测试

    RAMPS1.4 3D打印控制板:软件下载\连接\安装\测试 特别说明: 电源接反,电机驱动板接反将有可能烧毁芯片和电路,请再三确认后再进行通电. 如何使用: 1.需要用到的模块或器件: Arduin ...

随机推荐

  1. Qt中 QString 和int, char等的“相互”转换

    转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...

  2. redmine整合GIT版本库

    redmine整合GIT版本库   服务器的环境: Ubuntu 11.10 64位 Redmine 1.4.5.stable.10943 git version 1.7.5.4 + gitolite ...

  3. codevs1048 石子合并

    题目链接:http://codevs.cn/problem/1048/ 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代 ...

  4. Effective C++ 笔记2(构造,析构,赋值)

    条款5:了解C++默默编写并且调用了哪些函数 1.  构造函数,析构函数,拷贝赋值函数,拷贝构造函数. class Empty { public: //默认构造函数 Empty(){}; //拷贝构造 ...

  5. dede织梦cms-dede:autochannel标签

    按排序位置的获取单个栏目的链接信息 >>dede>> {dede:autochannel partsort='' typeid=''}{/dede:autochannel} & ...

  6. Python for Infomatics 第14章 数据库和SQL应用二(译)

    14.4 创建数据库和表 相比Python的列表和字典,数据库需要更多的已定义结构. 在我们创建数据库表之前,我们必须预先告诉数据库表和列的命名,以及计划保存到列中和数据类型.当数据库软件预先知道每列 ...

  7. SVN出现Invalid authz configuration解决方案

    思路: 1.检查是否为不存在的用户组或用户设置了权限(大部分为此问题,调整用户权限或删除账号后,但忘了去掉某个文件夹的权限) 2.检查authz文件的编码: 3.更改权限后是否未重启svn. 4.按照 ...

  8. linux菜鸟日记(3)

    Centos7利用shell编辑一串 一键完成一些基础配置的代码: 在这串shell代码中我实现了  IP地址的配置.光盘的挂载.本地yum源的搭建.一些服务的安装例如 httpd. php. ntp ...

  9. Cloud Engine:大杀器如何炼成

    郑昀(微博:http://weibo.com/yunzheng) 创建于2016/6/18 最后更新于2016/6/19 点击查看我的<如何从零搭建一个技术平台>,这是一个系列.转载时请注 ...

  10. Mariadb数据库设置及操作 一主多从 备份还原(实测笔记)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 数据库版本信息 : 10.1.20- ...