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

Gorilla/Mux 和 Websocket 竞争条件。这样安全吗?

Gorilla/Mux 和 Websocket 竞争条件。这样安全吗?

Go
尚方宝剑之说 2022-11-23 10:23:41

我正在开发一个 websocket,最近开始使用race. go run -race serve.go


得到这个结果:


WARNING: DATA RACE

Write at 0x0000019ab4a8 by goroutine 95:

  go-api/client.ServeWs()


Previous write at 0x0000019ab4a8 by goroutine 117:

  go-api/client.ServeWs()


我正在使用gorilla/mux并将其中一个请求升级到 websockets。我不确定它是否是由其他原因引起的,但即使是这个非常简单的设置仍然显示出竞争条件。我的猜测是因为websocket同时被两个例程写入,但只要两个请求都升级了,这有关系吗?或者是否有可能由于竞争条件而断开连接?


    //serve.go

    mux.HandleFunc("/data", func(w http.ResponseWriter, r *http.Request) {

        client.ServeWs(w, r)

    })

//client.go

func ServeWs(w http.ResponseWriter, r *http.Request) {

    upgrader = websocket.Upgrader{

        ReadBufferSize:  1024,

        WriteBufferSize: 1024,

        CheckOrigin: func(r *http.Request) bool {

            return true

        },

    }


    _, err := upgrader.Upgrade(w, r, nil)

    if err != nil {

        log.Println(err)

        return

    }

}


查看完整描述

1 回答

?
开心每一天1111

TA贡献1541条经验 获得超11个赞

因为升级器不依赖于请求,所以可以在包级别创建升级器


var upgrader = websocket.Upgrader{ ... fields as in ServeWs ... }

并从 ServeWs 中删除对升级程序的分配。


func ServeWs(w http.ResponseWriter, r *http.Request) {

    c, err := upgrader.Upgrade(w, r, nil)

    if err != nil {

        log.Println(err)

        return

    }

    defer c.Close()


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信