为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 中正确控制听众

如何在 golang 中正确控制听众

Go
汪汪一只猫 2022-08-15 19:19:17
我想根据某些东西的状态来控制一个监听器,假设我的程序将在文件的内容为1时侦听,如果内容为0,则不侦听。问题是,一旦一个监听器被初始化,就没有办法告诉他拒绝连接。只有“接受”状态;我必须关闭听众。所以我找到了一种方法来使用以下代码来做到这一点,但我觉得这不是一个好方法,因为我使用的是全局,通常这不是一个好主意。有没有更好的方法来做到这一点?var healthStatus boolfunc listen(l net.Listener, port int) {    var err error    l, err = net.Listen("tcp", ":"+strconv.Itoa(port))    if err != nil {        panic(err)    }    defer l.Close()    for {        if healthStatus == false {            _ = l.Close()            return        }        logrus.Debug("Going to listen !")        conn, err := l.Accept()        if err != nil {            panic(err)        }        go func(c net.Conn) {            _ = c.Close()        }(conn)        }    }func main() {    healthStatus = true    var listener net.Listener    var isListening = false    for {        logrus.Debug("Performing checks...")        healthStatus = healthcheck()                if healthStatus {            if !isListening {                isListening = true                //Restart listener                go listen(listener, config.port)            }        }        if !healthStatus {            if isListening {                isListening = false            }        }        time.Sleep(time.Second * 10)    }}编辑:带频道package mainimport (    "net"    "strconv"    "time")var listening = make(chan bool)func listen(l net.Listener, port int) {    var err error    l, err = net.Listen("tcp", ":"+strconv.Itoa(port))    if err != nil {        panic(err)    }    defer l.Close()    for {        localstatus := <- listening        if localstatus == false {        _ = l.Close()        return    }    conn, _ := l.Accept()    go func(c net.Conn) {    // Shut down the connection.        _ = c.Close()        listening <- true    }(conn)    }    }
查看完整描述

1 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

当运行状况变差时关闭侦听器。使用通道向接受环路发出信号,指示它是干净关机。


var listener net.Listener

var done chan struct{}

for {

    if healthcheck() {

        if listener == nil {

            var err error

            listener, err = net.Listen("tcp", ":"+strconv.Itoa(conig.port))

            if err != nil {

                panic(err)

            }

            done = make(chan struct{})

            go accept(listener, done)

        }

    } else {

        if listener != nil {

            close(done)

            listener.Close()

            done = nil

            listener = nil

        }

    }

    time.Sleep(time.Second * 10)

}

接受函数为:


func accept(l net.Listener, done chan struct{}) {

    for {

        conn, err := l.Accept()

        select {

        case <-done:

            return

        default:

        }

        if err != nil {

            panic(err)

        }

        go func(c net.Conn) {

            _ = c.Close()

        }(conn)

    }

}


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号