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

Go1.18(Windows)下如何在net/rpc中丢弃响应以模拟断连测试Paxos

解决Windows下模拟TCP断连的错误问题

问题原因

Windows系统的套接字模型与Unix类系统存在差异,通过TCPConn.File()获取的文件句柄无法直接用于syscall.Shutdown操作,这会触发"尝试对非套接字执行操作"的错误。

替代方案

直接使用Go标准库中net.TCPConn提供的CloseWrite()方法,这是跨平台的正确实现,无需依赖底层系统调用:

import (
    "net"
    "net/rpc"
    "log"
)

// ... 你的其他业务代码
rpcx := rpc.NewServer()
rpcx.Register(a)
l, e := net.Listen("tcp", a.localAddr)
a.listener = l
if e != nil {
    log.Fatal("listen error:", e)
}
go func() {
    for {
        conn, err := l.Accept()
        if err != nil {
            continue
        }
        c1, ok := conn.(*net.TCPConn)
        if !ok {
            conn.Close()
            continue
        }
        // 调用标准库方法关闭连接写端,模拟断连场景
        err = c1.CloseWrite()
        if err != nil {
            log.Printf("CloseWrite error: %v\n", err)
        }
    }
}()

补充说明

  • CloseWrite()仅关闭TCP连接的写方向,对端会收到EOF信号,完全符合模拟断连的测试需求。
  • 若需要直接断开整个连接,可调用conn.Close(),该方法会同时关闭读写两端。
  • 在Windows环境下,应优先使用Go标准库封装的网络操作方法,避免混用底层系统调用导致兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:18:13