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

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

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

Go
尚方宝剑之说 2022-11-23 10:23:41
我正在开发一个 websocket,最近开始使用race. go run -race serve.go得到这个结果:WARNING: DATA RACEWrite 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.gofunc 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贡献1836条经验 获得超12个赞

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


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
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

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