You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中如何用errors.Is检测UDPConn.Read返回的WSAEMSGSIZE错误?

检测Go中Windows平台UDP读取的WSAEMSGSIZE错误

在Windows平台下,你遇到的UDP读取错误对应Winsock的WSAEMSGSIZE错误(错误码10040),要检测该错误不能直接用errors.Is,需要通过errors.As提取底层系统错误类型后判断,具体实现如下:

核心检测函数

//go:build windows
// +build windows

import (
    "errors"
    "syscall"
)

func IsWSAEMsgSizeError(err error) bool {
    var sysErr syscall.Errno
    // 遍历错误链,提取底层的系统错误值
    if errors.As(err, &sysErr) {
        return sysErr == syscall.WSAEMSGSIZE
    }
    return false
}

业务代码中使用示例

conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: 7089})
if err != nil {
    // 处理监听初始化错误
}

buf := make([]byte, 1024)
_, _, err = conn.ReadFromUDP(buf)
if err != nil {
    if IsWSAEMsgSizeError(err) {
        // 处理数据包过大场景,例如扩容缓冲区后重新读取
        largerBuf := make([]byte, 4096)
        conn.ReadFromUDP(largerBuf)
    } else {
        // 处理其他网络类错误
    }
}

关键注意点

  • 不要通过错误文本判断:错误提示内容可能随Go版本、系统语言环境变化,而syscall.WSAEMSGSIZE是固定的系统错误码,可靠性更高。
  • 条件编译:通过//go:build windows限定代码仅在Windows平台编译,避免跨平台时出现兼容性问题。

内容的提问来源于stack exchange,提问作者Hoodoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:44:57