亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號