在goroutine中保持TCP连接活动,并检查连接是否丢失时是否超时

时间:2015-04-26 11:27:11

标签: tcp error-handling go server goroutine

我有一个TCP服务器启动并运行一个端口的监听和一个用于处理连接的go例程。我想知道是否有可能为每个连接运行一个例行程序,使net.SetKeepAlive(true)保持活着状态。还有错误处理,这样如果连接超时,它将执行清除功能,如从列表中删除连接?

处理程序:

func handleConnection(conn net.Conn, rec chan string) {
   var item QueItem
   buf := make([]byte, bufSize)
   l, err := conn.Read(buf)
   if err != nil || l < 0 {
    fmt.Println("Error reading from conn: ", conn)
    fmt.Println("Error reading: ", err)
   }

   err = json.Unmarshal(buf[:l], &item)
   if err != nil {
     fmt.Println("Error converting to JSON", jErr)
   }

  fmt.Printf("Received : %+v\n", item)
  fmt.Println("recived from:", conn.RemoteAddr())
  rec <- item.IP
}

TCPserver下:

for {
    conn, err := ln.Accept()
    if err != nil {
        fmt.Println("No accept", err)
        log.Println("Unable to accept connection", err)
    }
    go handleConnection(conn, recived)
}

1 个答案:

答案 0 :(得分:3)

要检查已建立的TCP连接,可以通过两种方式执行keep-alive机制。

在应用程序级别:   在空闲状态下,客户端和服务器都同意协议以相互发送预定的分组。在特定时间内缺少来自对等方的消息可能表示连接中存在问题。

在TCP层: 启用TCP堆栈以检查连接状态。启用此机制的TCP层将以固定的确定间隔发送keep-alive个消息。期望对等TCP堆栈发送keep-alive-ack。在需要的重新传输信号连接问题之后没有ACK并且应用程序将被正式通知。

我认为net.SetKeepAlive(true)是一种go方式,可以告知TCP保持活动状态。你不需要在日常工作中做任何特殊的构造。

TCP keep-alive效果很好。不需要负担应用程序以检查连接状态