【问题标题】:Go. Get error i/o timeout in server program走。在服务器程序中获取错误 i/o 超时
【发布时间】:2016-05-13 03:58:52
【问题描述】:

我编写了简单的服务器程序来接收来自客户端的数据。我有点不明白有时我从函数中得到错误 read tcp4 IP:PORT i/o timeout int, err := conn.Read([]byte) 函数 SetDeadline() 中设置的事件时间未超过。我展示了我的部分代码,但我认为这已经足够了。

我接收数据的主循环如下。

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,然后客户端发送新数据,而服务器当时正在做其他事情并拒绝连接。这只是我的假设,但我不确定。

【问题讨论】:

    标签: go tcp


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多