阻塞式网络读取需要设置截止时间,避免空闲的对端让任务永久等待。 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,
};
}