Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Golang中接受服务器连接或中断accept()循环_Go - Fatal编程技术网

如何在Golang中接受服务器连接或中断accept()循环

如何在Golang中接受服务器连接或中断accept()循环,go,Go,我需要在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 }

我需要在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
    }
    ...
}
用于{
挑选{

case对于任何服务,确保干净关闭的最佳实践是确保服务的每个部分都支持取消。添加支持是实现这一点的推荐方法

因此,首先,确保您的
net.Listener
未挂起恶意客户端连接。要添加
context.context
支持:

var lc net.ListenConfig

ln, err := lc.Listen(ctx, "tcp", ":8080")
取消
ctx
将中断握手期间可能阻塞的任何恶意客户端连接


编辑: 为了确保我们可以在
Listen()
呼叫被阻止等待时中断该呼叫,可以利用相同的
ctx
状态,并在检测到取消事件时(如前一个现已删除的应答中所述)关闭连接:

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