gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:34:06 25 4
gpt4 key购买 nike

我有一个 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 机制。

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

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

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

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

关于tcp - 在 goroutine 中保持 TCP 连接有效,并在连接丢失时检查它是否超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29877003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com