我有一个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)
}
答案 0 :(得分:3)
要检查已建立的TCP连接,可以通过两种方式执行keep-alive
机制。
在应用程序级别: 在空闲状态下,客户端和服务器都同意协议以相互发送预定的分组。在特定时间内缺少来自对等方的消息可能表示连接中存在问题。
在TCP层:
启用TCP堆栈以检查连接状态。启用此机制的TCP层将以固定的确定间隔发送keep-alive
个消息。期望对等TCP堆栈发送keep-alive-ack
。在需要的重新传输信号连接问题之后没有ACK并且应用程序将被正式通知。
我认为net.SetKeepAlive(true)
是一种go
方式,可以告知TCP保持活动状态。你不需要在日常工作中做任何特殊的构造。
TCP keep-alive
效果很好。不需要负担应用程序以检查连接状态