You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:27:04