coder / websocket

Minimal and idiomatic WebSocket library for Go
ISC License
3.8k stars 282 forks source link

failed: Close received after close #448

Open chjiyun opened 4 months ago

chjiyun commented 4 months ago

Hello, I recently encountered a problem. Can someone help me take a look?, I used the example and successfully ran it, but I sent a ping to the server and received an error below:

WebSocket connection to 'ws://127.0.0.1:8888/subscribe' failed: Close received after close
nhooyr commented 4 months ago

Can you show your client code?

chjiyun commented 4 months ago

@nhooyr go version 1.22.2

conn.addEventListener('open', ev => {
    console.info('websocket connected')
    setTimeout(() => {
      conn.send('ping')
    }, 3000)
  })
nhooyr commented 4 months ago

Unrelated to the library. Something's wrong with your client code calling close after the connection has been closed. See https://github.com/mqttjs/MQTT.js/issues/1361

fogrye commented 4 months ago

I would reopen this as after last update I have received same error with native WebSocket in Chrome, while safari is ok with that.

nhooyr commented 4 months ago

Ok possible we need to add a guard in c.writeClose to not write a close frame twice. I think that we're writing a close frame, we get a close frame back and then the code doesn't keep track that it already wrote a close frame and so writes a close frame in response to the handshake close frame.

fogrye commented 4 months ago

Yes, I saw that it's waiting for closing but CloseNow did not check if it was closed already. I believe that's what's happening.