【问题标题】:Porting getifaddrs to Win XP将 getifaddrs 移植到 Win XP
【发布时间】:2011-03-05 09:18:46
【问题描述】:

我正在尝试将 MacOSX 应用程序移植到 Windows,但遇到了有关 getifaddrs 的问题。基本上windows不支持它。我试图找到一种重新实现它的方法(对于 AF_INET 和 AF_INET6),但 Windows 上的“等效”功能似乎与 MacOSX 支持完全不同。

以前有人做过这种转换吗?如果是这样,有没有一种好方法可以让 Windows 像 MacOSX 一样向我报告界面信息?

【问题讨论】:

    标签: c++ macos windows-xp ipv6 ipv4


    【解决方案1】:

    Windows 上最接近的函数是GetAdaptersInfoGetAdaptersAddresses。 MSDN 文档非常全面,因此您应该可以找到所需的一切。

    【讨论】:

    • 是的,我看到了。不过,我有点不确定如何从该信息中获取 IPv6 区域索引……但我可能已经错过了明显的内容。
    【解决方案2】:

    getifaddrs() 不是一个可移植的解决方案,所以如果你需要支持多个平台,你应该考虑使用getaddrinfo,它是 POSIX 和 Windows 友好的。乍一看有点复杂,但实际上并没有那么糟糕。 This SO question 有一些关于该主题的好答案和链接。 (特别是,Beej's page 上的 showip.c 示例非常有用,here 是 Windows 示例;请注意,它顶部缺少 #include <stdio.h>,并确保链接到 Ws2_32.lib。)

    【讨论】:

    • 为什么投反对票?我非常想知道我是否写了一些不正确或误导性的东西。
    • 问题不在于将主机名解析为 IP 地址。
    • @VasilyRedkin,您是否点击了链接或阅读了getaddinfo 的手册页?该功能不只是将主机名转换为 IP 地址。可用于上报网络接口信息;如我的回答中所述,请参阅Beej's networking guide 上的 showip.c 示例。
    • 是的,我在 linux 和 freebsd 上阅读了 getaddrinfo(3) 的手册页,并阅读了链接文章上的 shoip 示例。我还阅读了 glibc 的实现 source codeMSDN 中的 getaddrinfo 手册。
    • MSDN 文章指出,“如果 pNodeName 参数指向计算机名称,则返回可用作源地址的计算机的所有永久地址。在Windows Vista 及更高版本,这些地址将包括由 GetUnicastIpAddressTable 或 GetUnicastIpAddressEntry 函数返回的所有单播 IP 地址,其中 MIB_UNICASTIPADDRESS_ROW 结构中的 SkipAsSource 成员设置为 false”。因此,您的答案仅对 Windows 部分正确。
    【解决方案3】:

    我已经在这里完成了,包括一个单独的 Wine 版本,因为与 IP 版本无关的例程当前无法按预期工作

    http://code.google.com/p/openpgm/source/browse/trunk/openpgm/pgm/getifaddrs.c

    LGPL 2.1 许可证

    编辑: Wine 1.3 修复了 IPv4 和 IPv6 友好 API 遇到的问题。

    【讨论】:

      【解决方案4】:

      也许libpcap的win32端口可以帮助你?

      (或 libnet 的端口,如果存在)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 1970-01-01
        • 2012-11-22
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        相关资源
        最近更新 更多