第三部分 · 6 / 6

场景示例

这一组把若干特性组合成更接近真实用法的小程序。读完它们,你基本就能照葫芦画瓢写自己的业务了。

速查表

目录场景
file-transferio.CopyConn 上传文件,优雅处理 EOF
large-message多 MiB 大消息:分片/重组 + 完整性校验
rpc请求/响应循环(RecvMsg→处理→SendMsg
chat全双工:并发的发送/接收 goroutine 共用一个 Conn
connection-styles一个 --mode 开关切换 rc-cm / rc-handshake / ud
multi-clientRC 服务端 Accept 循环服务多个客户端
ud-broadcast一个 UD 发送方 → 多个注册表发现的对端(AH 缓存)
bench-throughputSendMsg vs SendBatch 的 Gb/s 自测
tuning把每个 Option 都做成一个 flag,附调优指引

逐个说明

file-transfer —— 当成 io.ReadWriteCloser 用

客户端 io.Copy 把文件灌进连接,服务端 io.Copy 把连接写进文件。 关闭客户端连接会发 FIN,服务端的拷贝在 io.EOF 处自然终止。这是字节流适配器最实用的体现。

go run ./examples/file-transfer -l 0.0.0.0:18515 --out received.bin  # 服务端
go run ./examples/file-transfer 33.0.226.25:18515 --in payload.bin  # 客户端

large-message —— 大消息分片/重组

发一条几 MiB 的消息:一次 SendMsg 在信用流控下被透明拆成许多帧,一次 RecvMsg 重组回完整消息、 边界保留。两端都打印 SHA-256 验证完整性。

go run ./examples/large-message -l 0.0.0.0:18515
go run ./examples/large-message 33.0.226.25:18515 --size 16   # 发 16 MiB

rpc —— 请求/响应

客户端发请求并阻塞等回复;服务端循环 RecvMsg → 处理 → SendMsg(示例里把请求转大写)。 客户端关闭后,服务端的 RecvMsg 返回 io.EOF 退出。典型的同步 RPC 骨架。

chat —— 全双工并发

每一端同时跑一个发送 goroutine(stdin→对端)和一个接收循环(对端→stdout), 共用一个 Conn。演示了「一个并发读 + 一个并发写安全」的契约,以及关闭连接唤醒阻塞的 RecvMsg

connection-styles —— 三种建连一键切换

一个程序用 --mode 涵盖 rdmanet 的全部建连方式:

--mode传输建连
rc-cm(默认)RC 可靠rdma_cm
rc-handshakeRC 可靠TCP 握手(WithHandshake
udUD 数据报无连接,用 Addr 字符串寻址

multi-client —— 服务多个客户端

RC 服务端在 Accept 循环里逐个处理客户端(每个连接回显一条消息后关闭)。 服务端长驻,客户端可反复连。是写「一对多服务」的模板。

ud-broadcast —— UD 一对多

一个 UD 发送方通过注册表发现多个接收方,逐一 WriteToPacketConn 会为每个目的地 缓存一个 AddressHandle,重复发往同一对端时复用,省去重建 AH 的开销。

bench-throughput —— 批量增益自测

客户端把 N 条消息发两遍——先逐条 SendMsg,再批量 SendBatch——分别报告 Gb/s 和 Mmsg/s, 直观看出批量摊薄开销的收益。服务端用 RecvBatch 收两遍。

go run ./examples/bench-throughput -l 0.0.0.0:18515            # 服务端
go run ./examples/bench-throughput 33.0.226.25:18515 -n 100000 -s 1024 -b 32

tuning —— 所有 Option 一处试

把每个 rdmanet 选项都暴露成一个 flag,并打印解析后的配置,外加一个小回显,方便逐项实验调优。 想系统理解各 Option 的影响,配合性能选项一节读它。

建议的学习路径

推荐顺序 先跑 echo-msg(最小可用)→ 看 rpc / chat(真实交互模式)→ 想压测就上 cmd/go_rdmanet_bwbench-throughput → 需要精细控制再回到底层 perftest 包看 setup 全过程。
gordma 教程 · 全文完