在Rust中调用C标准库getaddrinfo后遍历addrinfo链表
在Rust中遍历getaddrinfo返回的addrinfo链表
在Rust中遍历getaddrinfo返回的addrinfo链表,逻辑和C基本一致,但所有涉及原始指针操作的代码必须放在unsafe块中,具体实现方式如下:
核心步骤
- 从
res指针(*mut *mut addrinfo)解引用得到链表的头节点指针 - 循环遍历:只要当前节点指针不为空,就处理节点内容,再通过
ai_next字段获取下一个节点 - 遍历完成后调用
freeaddrinfo释放链表内存,避免泄漏
代码示例
假设你已通过orig_getaddrinfo调用成功(返回值ret == 0),res为*mut *mut libc::addrinfo类型,遍历代码如下:
use libc::{addrinfo, freeaddrinfo}; if ret == 0 { unsafe { // 获取链表的第一个节点 let mut current = *res; while !current.is_null() { // 操作当前节点的字段,示例:打印地址族信息 let family = (*current).ai_family; println!("地址族: {}", family); // 移动到下一个节点 current = (*current).ai_next; } // 必须释放链表内存 freeaddrinfo(*res); } }
关键注意事项
- 强制使用unsafe块:所有解引用原始指针、访问C结构体字段的操作都需要放在
unsafe中,Rust无法保证这些外部指针的安全性 - 空指针检查:每次循环都要判断
current是否为空,避免解引用空指针引发未定义行为 - 内存释放:遍历完成后必须调用
libc::freeaddrinfo,否则会造成内存泄漏 - 结构体一致性:直接使用
libc::addrinfo即可,无需自行定义,确保和系统C库的结构体布局完全匹配
内容的提问来源于stack exchange,提问作者eof
相关产品推荐
相关产品推荐

