如何在Zig中进行Socket编程?相关函数参数取值存疑
Zig Socket 编程参数详解与示例
1. 创建Socket的参数对应
Zig的std.os.socket()参数和Pythonsocket.socket()一一对应,相关常量都归类在std.os的嵌套命名空间中:
- domain参数:对应地址族,IPv4用
std.os.AF.INET,IPv6用std.os.AF.INET6 - socket_type参数:对应套接字类型,TCP流用
std.os.SOCK.STREAM,UDP数据报用std.os.SOCK.DGRAM - protocol参数:一般传
0,让系统自动选择对应类型的默认协议(TCP/UDP)
2. std.os.bind() 参数说明
sock:std.os.socket()返回的套接字文件描述符addr:需传入对应地址族的结构体,以IPv4为例用std.os.sockaddr_in,需手动填充字段:sin_family:设为std.os.AF.INETsin_port:用std.os.htons()将主机字节序的端口转为网络字节序sin_addr:用std.os.in_addr{ .s_addr = std.os.htonl(std.os.INADDR_ANY) }绑定到所有可用网卡
len:addr结构体的字节长度,直接用@sizeOf(@TypeOf(addr))获取
3. std.os.accept() 参数说明
sock:已调用std.os.listen()后的监听套接字描述符addr:传入std.os.sockaddr类型指针,用于存储客户端的地址信息addr_size:传入*u32类型变量,初始值设为@sizeOf(@TypeOf(addr.*)),函数会修改它为实际地址长度flags:一般传0,无需额外标志
完整TCP服务器示例
const std = @import("std"); const os = std.os; pub fn main() !void { // 创建TCP套接字 const sock = try os.socket(os.AF.INET, os.SOCK.STREAM, 0); defer os.close(sock); // 设置端口快速重用选项 const optval: c_int = 1; try os.setsockopt(sock, os.SOL.SOCKET, os.SO.REUSEADDR, &optval, @sizeOf(c_int)); // 绑定地址与端口 var addr = os.sockaddr_in{ .sin_family = os.AF.INET, .sin_port = try os.htons(8080), .sin_addr = os.in_addr{ .s_addr = os.htonl(os.INADDR_ANY) }, .pad = undefined, }; try os.bind(sock, @ptrCast(*os.sockaddr, &addr), @sizeOf(os.sockaddr_in)); // 开始监听连接 try os.listen(sock, 10); // 接受客户端连接 var client_addr: os.sockaddr = undefined; var client_addr_len: u32 = @sizeOf(os.sockaddr); const client_sock = try os.accept(sock, &client_addr, &client_addr_len, 0); defer os.close(client_sock); std.debug.print("Accepted connection from client\n", .{}); }
内容的提问来源于stack exchange,提问作者Pexicade
相关产品推荐
相关产品推荐

