为了账号安全,请及时绑定邮箱和手机立即绑定

在服务器程序中获取错误 i/o 超时

在服务器程序中获取错误 i/o 超时

Go
婷婷同学_ 2021-12-07 18:31:40
我编写了简单的服务器程序来接收来自客户端的数据。我有点不明白有时我会得到错误读取 tcp4 IP:PORT i/o timeout from function int, err := conn.Read([]byte)event time set in function SetDeadline()not been exceeded. 我展示了我的代码的一部分,但我认为这已经足够了。我接收数据的主循环如下。c := NewClient()c.kickTime: time.Now()func (c *Client) Listen(){    durationToClose := time.Minute*time.Duration(5),    c.conn.SetDeadline(c.kickTime.Add(c.durationToClose))    buffer := make([]byte, 1024)        for{            reqLen, err := c.conn.Read(buffer)            if err != nil || reqLen == 0 {                fmt.Printf(err)                break            }            if err = c.CheckData(buffer) ; err != nil{             fmt.Printf("something is bad")            }else{            result := c.PrepareDataToSendInOtherPlace(buffer)            go c.RecievedData(result)            }            c.conn.SetDeadline(c.kickTime.Add(c.durationToKick))        }}对我来说,只有可疑的可能是附加功能,因为PrepareDataToSendInOtherPlace() , CheckData()这可能需要一些时间 CPU,然后新数据由客户端发送,而服务器当时在做其他事情并拒绝连接。这只是我的假设,但我不确定。
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

撇开语法错误和未声明的变量不谈,您向我们展示的内容不可能无限期地向前推进读/写截止日期。

这可以运行的最长时间是在第一个time.Now()c.kickTime.Add(c.durationToKick))之后的固定持续时间之前。你可能想要这样的东西:

c.conn.SetDeadline(time.Now().Add(c.durationToKick))


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信