gpt4 book ai didi

go - 如何使用ws.SetWriteDeadline?

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

当我关闭浏览器时,我想在 3 秒而不是 1 分钟内断开 websocket。以下只是继续写入 void 而不会出错,直到我猜的 tcp ip 超时,而不是 SetWriteDeadline。

f := func(ws *websocket.Conn) {
for {
select {
case msg := <-out:
ws.SetWriteDeadline(time.Now().Add(3 * time.Second))
if _, err := ws.Write([]byte(msg)); err != nil {
fmt.Println(err)
return
}
case <-time.After(3 * time.Second):
fmt.Println("timeout 3")
return
}
}
}
return websocket.Handler(f)

我需要等待这个错误

write tcp [::1]:8080->[::1]:65459: write: broken pipe

在它最终关闭连接之前,这大约需要一分钟或更长时间。

最佳答案

您是否正确使用了 WriteDeadline。截止日期指定将数据写入 TCP 堆栈的缓冲区的时间,而不是对等方接收数据的时间(如果它收到的话)。

为了可靠地检测关闭的连接,应用程序应该向对等方发送 PING 并等待预期的 PONG。您使用的包不支持此功能,但 Gorilla包确实如此。 Gorilla chat application展示了如何使用 PING 和 PONG 检测关闭的连接。

关于go - 如何使用ws.SetWriteDeadline?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37822168/

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