TCP 只保证字节顺序,不保证应用层消息边界。一次写入可能被接收方分多次读取, 多次写入也可能在一次读取中合并。此示例在消息前添加四字节长度,然后读取完整的一帧。 为了保持示例确定且无需外部服务,代码使用内存中的字节流演示分帧逻辑;同样的方式也适用于 TCP 连接。
//! Frame a message on a byte stream with a four-byte length prefix.
const std = @import("std");
const Io = std.Io;
pub fn main() !void {
const payload = "message boundaries need an explicit frame";
var encoded: [256]u8 = undefined;
var writer = Io.Writer.fixed(&encoded);
try writer.writeInt(u32, payload.len, .big);
try writer.writeAll(payload);
var reader = Io.Reader.fixed(encoded[0..writer.end]);
const frame_len = try reader.takeInt(u32, .big);
if (frame_len > 256) return error.FrameTooLarge;
var frame: [256]u8 = undefined;
try reader.readSliceAll(frame[0..frame_len]);
std.debug.print("received {d}-byte frame: {s}\n", .{ frame_len, frame[0..frame_len] });
}