在 goroutine 中保持 TCP 连接有效,并在连接丢失时检查它是否超时

Keeping a TCP connection alive in a goroutine and check if it timesout if the connection is lost

我有一个 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
}

TCP 服务器:

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

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

在应用层面: 在空闲情况下,客户端和服务器都同意一个协议来相互发送预先确定的数据包。在特定时间内缺少来自对等方的消息可能表示连接出现问题。

在TCP层: 启用 TCP 堆栈以检查连接状态。启用此机制的 TCP 层将定期发送 keep-alive 消息。它会期望对等 TCP 堆栈发送 keep-alive-ack。在需要重新传输信号连接问题后没有 ACK,应用程序将被及时通知。

我认为net.SetKeepAlive(true)是一种go通知TCP保持活动的方式。你不需要在 go routine 中做任何特殊的构造。

TCP keep-alive 运行良好。应用程序无需检查连接状态