阻塞式网络读取需要设置截止时间,避免空闲的对端让任务永久等待。 std.Io.net.Socket.receiveTimeout 在截止时间内没有收到 UDP 数据报时返回 error.Timeout。其他支持 std.Io.Timeout 的网络操作也可以采用相同的超时策略。

//! Wait for a UDP datagram with a bounded receive time.

const std = @import("std");
const net = std.Io.net;

pub fn main(init: std.process.Init) !void {
    const io = init.io;
    const address = net.IpAddress{ .ip4 = .loopback(0) };
    const socket = try address.bind(io, .{
        .mode = .dgram,
        .protocol = .udp,
    });
    defer socket.close(io);

    var buffer: [1024]u8 = undefined;
    const timeout: std.Io.Timeout = .{
        .duration = .{
            .clock = .awake,
            .raw = .fromNanoseconds(250 * std.time.ns_per_ms),
        },
    };
    _ = socket.receiveTimeout(io, &buffer, timeout) catch |err| switch (err) {
        error.Timeout => {
            std.debug.print("no datagram received within 250 ms\n", .{});
            return;
        },
        else => return err,
    };
}