gpt4 book ai didi

go - 如何在 Golang 中接受服务器连接或跳出 accept() 循环

转载 作者:行者123 更新时间:2023-12-05 01:30:20 29 4
gpt4 key购买 nike

我需要在 Golang 中实现一个服务器。为此,我正在使用 net 包,但我不明白如何优雅地从 accept 循环中跳出。

所以看看 net 包中的示例:

ln, err := net.Listen("tcp", ":8080")
if err != nil {
// handle error
}
for {
conn, err := ln.Accept()
if err != nil {
// handle error
}
go handleConnection(conn)
}

我想做更多的事情:

for {
select {
case <-done:
break
case conn, err := <-ln.Accept():
if err != nil {
break
}
...
}

换句话说,我希望能够以某种方式优雅地终止程序。

最佳答案

对于任何服务,确保干净关闭的最佳做法是确保服务的每个部分都支持取消。添加context.Context支持是实现这一目标的推荐方式。

所以首先,确保您的 net.Listener 不会在恶意客户端连接上挂起。所以要添加 context.Context 支持:

var lc net.ListenConfig

ln, err := lc.Listen(ctx, "tcp", ":8080")

取消 ctx 将中断此处可能在握手期间阻塞的任何恶意客户端连接。


编辑:为确保我们可以在 Listen() 调用被阻塞等待时中断它,可以利用相同的 ctx 状态和(如前文所述,现已删除, answer)检测到取消事件时关闭连接:

go func() {
<-ctx.Done()
log.Println("shutting service down...")
ln.Close()
}()

工作示例:https://play.golang.org/p/LO1XS4jBQ02

关于go - 如何在 Golang 中接受服务器连接或跳出 accept() 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67187855/

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