一尘不染

如何中断执行(* TCPListener)接受的goroutine?

go

我最近在玩go,尝试制作一些服务器来响应tcp连接上的客户端。

我的问题是我该如何干净地关闭服务器并中断在以下调用中当前“被阻止”的go例程

func(* TCPListener)接受吗?

根据接受文件

Accept在侦听器接口中实现Accept方法;它等待下一个调用并返回通用Conn。

错误也很少被记录下来。


阅读 285

收藏
2020-07-02

共1个答案

一尘不染

这是我一直在寻找的东西。也许将来会帮助某人。注意使用select和“ c”通道将其与退出通道结合使用

    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        // handle error
    }
    defer ln.Close()
    for {
        type accepted struct {
            conn net.Conn
            err  error
        }
        c := make(chan accepted, 1)
        go func() {
            conn, err := ln.Accept()
            c <- accepted{conn, err}
        }()
        select {
        case a := <-c:
            if a.err != nil {
                // handle error
                continue
            }
            go handleConnection(a.conn)
        case e := <-ev:
            // handle event
            return
        }
    }
2020-07-02