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

mhs*_*nsc 9 go

我正在玩最近去尝试制作一些服务器,它在tcp连接上响应客户端.

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

func(*TCPListener)接受?

根据Accept文档

Accept在Listener接口中实现Accept方法; 它等待下一个调用并返回一个通用的Conn.

这些错误也几乎没有记录.

thw*_*hwd 5

只需Close()net.Listener你从一开始net.Listen(...)呼叫,从正在执行的够程返回。


Lev*_*ite 5

TCP侦听器截止日期

您不一定需要额外的 go 例程(不断接受),只需指定一个Deadline.

for 例子:

for {

    // Check if someone wants to interrupt accepting
    select {
    case <- someoneWantsToEndMe: 
        return // runs into "defer listener.Close()"
    default: // nothing to do
    }

    // Accept with Deadline
    listener.SetDeadline(time.Now().Add(1 * time.Second)
    conn, err := listener.Accept()
    if err != nil {
        // TODO: Could do some err checking (to be sure it is a timeout), but for brevity
        continue
    }

    go handleConnection(conn)
}
Run Code Online (Sandbox Code Playgroud)


mhs*_*nsc 3

这就是我一直在寻找的东西。也许将来可以帮助某人。请注意使用 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
        }
    }
Run Code Online (Sandbox Code Playgroud)