走。获取服务器程序中的错误i / o超时

时间:2016-02-03 19:19:19

标签: go tcp

我简单地编写了服务器程序来接收客户端的数据。我有点不明白有时我会从函数中获得错误读取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,然后客户端发送新数据,服务器在做其他事情时拒绝连接。这只是我的假设,但我不确定。

1 个答案:

答案 0 :(得分:1)

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

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

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