场景示例
这一组把若干特性组合成更接近真实用法的小程序。读完它们,你基本就能照葫芦画瓢写自己的业务了。
速查表
| 目录 | 场景 |
|---|---|
file-transfer | 用 io.Copy 在 Conn 上传文件,优雅处理 EOF |
large-message | 多 MiB 大消息:分片/重组 + 完整性校验 |
rpc | 请求/响应循环(RecvMsg→处理→SendMsg) |
chat | 全双工:并发的发送/接收 goroutine 共用一个 Conn |
connection-styles | 一个 --mode 开关切换 rc-cm / rc-handshake / ud |
multi-client | RC 服务端 Accept 循环服务多个客户端 |
ud-broadcast | 一个 UD 发送方 → 多个注册表发现的对端(AH 缓存) |
bench-throughput | SendMsg 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-handshake | RC 可靠 | TCP 握手(WithHandshake) |
ud | UD 数据报 | 无连接,用 Addr 字符串寻址 |
multi-client —— 服务多个客户端
RC 服务端在 Accept 循环里逐个处理客户端(每个连接回显一条消息后关闭)。
服务端长驻,客户端可反复连。是写「一对多服务」的模板。
ud-broadcast —— UD 一对多
一个 UD 发送方通过注册表发现多个接收方,逐一 WriteTo。PacketConn 会为每个目的地
缓存一个 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_bw 或 bench-throughput →
需要精细控制再回到底层 perftest 包看 setup 全过程。