golang net包tcp超时设置并判断是否超时
golang的net包设置超时有三个函数, 定义在net.Conn, 它是一个interface, 如下:
SetDeadline(t time.Time) error // 设置读写超时, 如果超时, 会返回超时错误. 等同于同时设置以下两个函数.
SetReadDeadline(t time.Time) error // 设置读超时, 如果超时, 会返回超时错误.
SetWriteDeadline(t time.Time) error // 设置写超时, 如果超时, 会返回超时错误.
本文主要验证的是写超时, 并判断超时错误, 主要是通过reflect和unsafe把err转成(*net.OpError). 测试代码如下:
package mainimport ("fmt""net""os""reflect""syscall""time""unsafe"
)func main() {listener, err := net.Listen("tcp", "127.0.0.1:10299")if err != nil {fmt.Printf("listen fail, err: %v\n", err)os.Exit(-1)}defer listener.Close()for {conn, err := listener.Accept()if err != nil {fmt.Printf("accept fail, err: %v\n", err)continue}fmt.Printf("accept: %s successfully!\n", conn.RemoteAddr())go write(conn)}
}func write(c net.Conn) {defer c.Close()now := time.Now()begin := now.Local().UnixNano() / (1000 * 1000)// 为了验证超时, 在循环外设置, 2秒超时c.SetWriteDeadline(now.Add(time.Second * 2))for {if _, err := c.Write([]byte("Write Msg")); err != nil {// 这个错误是不能转换*net.OpErrorif err == syscall.EINVAL {return}// 转换成*net.OpErroropErr := (*net.OpError)(unsafe.Pointer(reflect.ValueOf(err).Pointer()))if opErr.Err.Error() == "i/o timeout" {end := time.Now().Local().UnixNano() / (1000 * 1000)fmt.Printf("Write timeout! end: %d, begin: %d, timeOut: %dms", end, begin, end-begin)return}return}time.Sleep(time.Millisecond)}
}
测试结果如下:
结束:
这是通过指针转换并通过比较字符串的方式判断的, 如果哪位同学有更方便的方法, 请告知以下, 谢谢.
golang net包tcp超时设置并判断是否超时相关推荐
- java接口超时设置_java接口请求超时处理方法
//********* // 成员内部类 class CallableThread implements Callable { @Override public Result call() { try ...
- Ajax设置超时时长,jquery ajax超时设置
var ajaxTimeoutTest = $.ajax({ url:'', //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : 'get', //请求方式 ...
- ZuulFilter和Fegin超时设置
之前配置ZuulFilter和Fegin超时时用了相同的配置方法,之前请求时数据量较小,没有出现什么问题.可是今天用Sidecar调用了python的一个服务,这个服务比较耗时,问题就出现了,各种超时 ...
- C# 的tcp Socket设置自定义超时时间
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- C# 中使用TCP连接设置超时问题
在使用C#中用TCP连接去扫描IP的过程中,发现,TCP连接没有可以设置连接超时的方法,如果扫描到空的IP或连接失败,那要等20多秒,甚至更长, 我们可以重新去用Thread的join这个带参数的线程 ...
- 路由器NAT超时设置引起的APP的TCP长连接丢失
之前碰到一个奇怪的现象,玩家在打战场的时候,由于一场打下来时间比较长,结果战斗结束之后,丢失了与Portal Server的连接,但奇怪的是没有收到任何连接丢失的事件.能成功发送消息,但服务器收不到, ...
- 服务超时时间如何设置、如何对超时时间治理、超时设计原则一文揭秘!
微服务是⼀种分布式架构,系统内各部分(服务)被部署为单独的应用程序,并通过某种远程访问协议进⾏通讯.分布式应⽤的挑战之⼀就是如何管理远程服务的可用性和它们的响应.本⽂主要探讨服务的响应时间对系统的影响 ...
- php socket recv 超时,socket编程中的超时设置示例详解之一
简介: 在网络通讯中,如果socket处于阻塞模式运行时,就需要考虑处理socket操作超时的问题. 所谓阻塞模式,是指其完成指定的操作之前阻塞当前的进程或线程,直到操作有结果返回. 在我们直接调用s ...
- RPC的超时设置,一不小心就是线上事故
来自:IT人的职场进阶 上面这张监控图,对于服务端的研发同学来说再熟悉不过了.在日常的系统维护中,『服务超时』应该属于监控报警最多的一类问题. 尤其在微服务架构下,一次请求可能要经过一条很长的链路,跨 ...
最新文章
- cloud自动发卡平台cloudfaka_open-cloud基于springcloud、oauth2、nacos打造的微服务开放平台...
- php声明对象的关键字是,PHP面向对象this关键字!
- httpclient 调取接口_HttpClient调用接口发送文件
- VTK:简单操作之RandomSequence
- Android:TextView 自动滚动(跑马灯) (转)
- EasyUI加载外部页面需要使用html片段
- 命令行打印文件树列表: tree 1
- bash/shell编程学习(2)
- 数据协作如何解决大数据的大问题
- android加载dex方法,[原创]分享一个快速加载dex文件的方法
- phoenix-5.1.2 Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM
- windows10系统装cad2007提示缺少NET组件
- eclipse的主题背景设置(关爱你的眼睛,从这里做起)
- 沃尔玛erp系统功能分析
- 60个实用Android框架排行榜
- STM32 OLED显示屏
- 时间管理(详细说明)
- 江南大学计算机科学专业排名,江南大学热门专业排名
- 浅谈 -128的原码 反码 补码
- android 单通道多应用Push系统的设计与实现