我只编写了服务器程序来接收来自客户端的数据。我有点不明白,有时候我会从函数中读取cp4 IP:PORT I / O超时时出现错误
未超过在函数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时间,然后新数据由客户端发送,而服务器当时又在做其他事情并拒绝连接。这只是我的假设,但我不确定。

最佳答案

除了语法错误和未声明的变量之外,您要向我们显示的内容不可能无限期地向前走读/写截止日期。

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

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

关于go - 走。在服务器程序中获取错误I/O超时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35185789/

10-13 01:02
查看更多