【问题标题】:gorilla golang websocket.IsUnexpectedCloseError not working correctly under windows?gorilla golang websocket.IsUnexpectedCloseError 在 Windows 下无法正常工作?
【发布时间】:2021-10-15 01:38:54
【问题描述】:

我有一个例程尝试检测读取时的 websocket 错误是否是 UnexpectedCloseError。 这是代码...

有一个变量:

myWebsocket                      *websocket.Conn

我的方法是:

messageType, data, err := myWebsocket.ReadMessage()
if err != nil {
    if websocket.IsUnexpectedCloseError(err) {
        log.Debugf("WebsocketReadDataMessage: unexpected close error: %v", err)
    } else {
        log.Warnf("EXTRANGE!!!!: WebsocketReadDataMessage: error: %v", err)
    }
    return err
}

在 Windows 下运行此代码有时 websocket 会关闭,但对 websocket.IsUnexpectedCloseError 的调用返回“false”,并且我收到错误文本“EXTRANGE!!!!: WebsocketReadDataMessage: error: wsarecv: 现有连接被强制关闭由远程主机。”

搜索“wsarecv”,发现是个winsock2函数:https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsarecv

为什么 IsUnexpectedCloseError 不将此错误视为“UnexpectedCloseError”?这是一个错误还是我做错了什么?我能做什么

【问题讨论】:

  • 感谢您的回答 Cerise。我试图区分是否由于意外的 websocket 关闭而发生读取错误。如果意外关闭,我将尝试重新打开 websocket。我不明白为什么会出现“wsarecv:现有连接被远程主机强制关闭”的错误。不是 *websocket.CloseError。
  • 我怎么知道websocket的底层网络连接是否已经关闭,我需要重新打开websocket连接,因为“wsarecv:现有连接被强行关闭”远程主机。”错误?

标签: windows go websocket gorilla


【解决方案1】:

websocket.IsUnexpectedCloseError() 函数在 Windows 上正常工作。函数中没有平台相关代码。

函数websocket.IsUnexpectedCloseError 返回一个布尔值,指示错误是否是*websocket.CloseError,其代码不在预期代码列表中。 *websocket.CloseError 代表从对等方发送的 close message*websocket.CloseError 并不表示底层网络连接已关闭。根据文档中的示例,该函数旨在帮助调试。

听起来您的目标是确定连接何时不再可用。 ReadMessage() 返回任何错误后,连接不可用。关闭连接并在出现任何错误时重新连接。

messageType, data, err := myWebsocket.ReadMessage()
if err != nil {
    myWebsocket.Close()
    return err
}

【讨论】:

  • 好的,谢谢Cerise!!!!!
猜你喜欢
  • 2016-05-06
  • 2017-09-23
  • 2020-08-04
  • 2016-04-11
  • 1970-01-01
  • 2019-09-01
  • 2021-01-14
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多