feature. See also
. The project being documented here (as the example) is the Zig library itself.
Threaded.netReceiveOneWindows
fn netReceiveOneWindows(
t: *Threaded,
socket_handle: net.Socket.Handle,
message: *net.IncomingMessage,
data_buffer: []u8,
flags: net.ReceiveFlags,
) net.Socket.ReceiveError!void
File
Code
fn netReceiveOneWindows(
t: *Threaded,
socket_handle: net.Socket.Handle,
message: *net.IncomingMessage,
data_buffer: []u8,
flags: net.ReceiveFlags,
) net.Socket.ReceiveError!void {
if (!have_networking) return error.NetworkDown;
_ = t;
const iovecs: [1]windows.AFD.WSABUF(.@"var") = .{.{
.buf = data_buffer.ptr,
.len = std.math.cast(std.os.windows.ULONG, data_buffer.len) orelse return error.MessageOversize,
}};
var storage: PosixAddress = undefined;
var addr_len: windows.ULONG = @sizeOf(PosixAddress);
const iosb = try deviceIoControl(&.{
.file = .{ .handle = socket_handle, .flags = .{ .nonblocking = true } },
.code = windows.IOCTL.AFD.RECEIVE_DATAGRAM,
.in = @ptrCast(&windows.AFD.RECV_DATAGRAM_INFO{
.BufferArray = &iovecs,
.BufferCount = iovecs.len,
.AfdFlags = .{ .NO_FAST_IO = true, .OVERLAPPED = true },
.TdiFlags = .{ .NORMAL = !flags.oob, .EXPEDITED = flags.oob, .PEEK = flags.peek },
.Address = &storage,
.AddressLength = &addr_len,
}),
});
switch (iosb.u.Status) {
.SUCCESS, .RECEIVE_EXPEDITED => |status| message.* = .{
.from = addressFromPosix(&storage),
.data = data_buffer[0..iosb.Information],
.control = &.{},
.flags = .{
.eor = false,
.trunc = false,
.ctrunc = false,
.oob = switch (status) {
else => unreachable,
.SUCCESS, .RECEIVE_PARTIAL, .BUFFER_OVERFLOW => false,
.RECEIVE_EXPEDITED, .RECEIVE_PARTIAL_EXPEDITED => true,
},
.errqueue = false,
},
},
.RECEIVE_PARTIAL,
.RECEIVE_PARTIAL_EXPEDITED,
=> |status| return windows.unexpectedStatus(status),
.CANCELLED => unreachable,
.INSUFFICIENT_RESOURCES => return error.SystemResources,
.BUFFER_OVERFLOW => return error.MessageOversize,
.PORT_UNREACHABLE => return error.PortUnreachable,
else => |status| return windows.unexpectedStatus(status),
}
}