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] });
}