TODO:Golang UDP连接简单测试慎用Deadline
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”, remoteaddr, 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:”, 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的时间戳。本文仅供参考,如果有相应场景,会使用到,^_^。

TODO:Golang UDP连接简单测试慎用Deadline的更多相关文章
- 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制
第三期 · 使用 Vue 3.1 + TailWind.CSS + Axios + Golang + Sqlite3 实现简单评论机制 效果图 CommentArea.vue 我们需要借助js的Dat ...
- NetworkComms V3 之支持TCP连接和UDP连接
NetworkComms V3 无缝的支持TCP连接和UDP连接. 您可以很容易的创建这两种连接 //创建一个连接信息对象 ConnectionInfo connInfo = ); //创建一个TCP ...
- .NET Socket TCP 50W在线连接交互测试
在平常的交流中经常有人问.net socket能支持多少在线?和C++或linux下比起来应该差很远吧?其实产生这样问题的主要原因是.net很少人去做这方面的测试,而在linux下则经常听到什么100 ...
- java,UDP协议简单实现
//UDP协议简单实现-----Serverpackage UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; i ...
- ORACLE 数据库简单测试
ORACLE 数据库简单测试 操作系统:Windows 7 – ORACLE:oracle database 10.2.0.4 一.目的 测试 启动监听程序.数据库 非同一个用户的情况,用户是否可以 ...
- struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)
为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ...
- golang实现的简单优先队列
下面是golang实现的简单优先队列,参考信息可以查看https://golang.org/pkg/container/heap/或者https://golang.google.cn/pkg/cont ...
- [20190211]简单测试端口是否打开.txt
[20190211]简单测试端口是否打开.txt --//昨天看一个链接,提到如果判断一个端口是否打开可以简单执行如下:--//参考链接:https://dba010.com/2019/02/04/c ...
- RAMPS1.4 3D打印控制板:软件下载\连接\安装\测试
RAMPS1.4 3D打印控制板:软件下载\连接\安装\测试 特别说明: 电源接反,电机驱动板接反将有可能烧毁芯片和电路,请再三确认后再进行通电. 如何使用: 1.需要用到的模块或器件: Arduin ...
随机推荐
- Java 之 异常处理
1.异常: a.问题(Throwable):异常(Exception).错误(Error) 异常(Exception):运行时异常(RuntimeException).编译时异常(Unhandle ...
- 【Hawk】入门教程(1)——从URL开始
入门教程(1)--从URL开始 首先感谢辛苦的沙漠君 先把沙漠君的教程载过来:)可以先看一遍 Hawk-数据抓取工具:简明教程 Hawk 数据抓取工具 使用说明(二) 20分钟无编程抓取大众点评17万 ...
- su root认证失败的解决方法
sudo passwd 输入安装密码. 输入新密码. 输入 su 即获得root权限.
- C++-Qt【1】-退出程序&静态调试
目前还没有发现很好的调试qt代码的方法,权且记录一下: #include "mainwindow.h" #include "ui_mainwindow.h" # ...
- BZOJ的两道osu概率DP easy与osu
坑 http://blog.csdn.net/CreationAugust/article/details/49516415 http://blog.csdn.net/braketbn/article ...
- 从零开始山寨Caffe·柒:KV数据库
你说你会关系数据库?你说你会Hadoop? 忘掉它们吧,我们既不需要网络支持,也不需要复杂关系模式,只要读写够快就行. ——论数据存储的本质 浅析数据库技术 内存数据库——STL的map容器 关 ...
- 介绍两个挺好用的基于Jquery的上传工具
一.ajaxFileUpload 二.fineUploader
- 软件工程:Wordcount程序作业
由于时间的关系,急着交作业,加上这一次也不是那么很认真的去做,草草写了“Wordcount程序”几个功能,即是 .txt文件的读取,能计算出文件内容的单词数,文件内容的字符数,及行数. 这次选用C来做 ...
- 通读SDWebImage①--总体梳理、下载和缓存
本文目录 下载操作SDWebImageDownloaderOptions和下载过程实现 下载管理SDWebImageDownloader 缓存SDImageCache SDWebImageManage ...
- mac与windows通过ftp传输文件
1.两个系统相互传文件,比较通用的方式是用QQ,两台电脑一台各登陆一个qq,发文件就行了,在同一个网段时,qq会自动转换为按局域网的方式传输. 2.本人不愿安装qq,以ftp方式进行传输,先在wndo ...