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
相关产品推荐
相关产品推荐

