【问题标题】:windows equivalent of inet_aton相当于 inet_aton 的 windows
【发布时间】:2010-03-10 21:18:41
【问题描述】:

我正在将一些为 linux 系统编写的代码转换为 windows 系统。我在我的 Windows 系统中使用 C++,想知道函数 inet_aton 的等价物。

【问题讨论】:

    标签: c++ linux unix


    【解决方案1】:

    Windows 支持inet_pton,它具有与inet_aton 类似的接口(但也适用于 IPV6 地址)。只需提供AF_INET 作为第一个参数,否则它将像inet_aton 一样工作。

    (如果您可以更改 Linux 源,inet_pton 也可以在那里工作)。

    【讨论】:

    • 但仅适用于 Vista 及以上版本。在 Windows XP 上它将无法加载。
    【解决方案2】:

    它是 Windows 等价物,而不是 C++ 等价物,但您可能想要 inet_addr,我相信它早于 inet_aton,并且 Windows 支持。

    http://msdn.microsoft.com/en-us/library/ms738563.aspx

    那篇文章还在“另见”部分列出了用于处理 IPv6 地址等的完整的详细命名函数集。

    【讨论】:

    • 一旦我使用 inet_addr 并将 in_addr 结构的 S_addr 成员设置为返回值,那么 in_addr 结构的另外两个联合成员是什么?我不太确定这些(S_un_b 和 S_un_w)需要设置为什么。
    • 我假设我可以只使用 sockaddr 结构类型而不是 sockaddr_in 类型,因此不需要担心 S_un_b 和 S_un_w ....尽管我仍然想知道它们的用途为了。谢谢。
    • 我也不知道为什么我忽略了它是一个工会的事实。我想不需要进一步解释。
    • 工会的其他成员是为了如果你想以某种方式操纵地址,那么你可以逐字节查看它。在 Windows 上,这是有道理的,因为 Windows 始终是 little-endian。不过,您很少需要这样做:我猜最常见的操作是应用网络掩码,而您不需要为此进行字节访问。
    【解决方案3】:

    要在 Windows XP 中运行,您可以尝试以下检查:

    #pragma comment(lib, "Ws2_32.lib")
    
    sockaddr_in inaddr;
    
    #ifdef _WIN32_WINNT 0x0501
        inaddr.sin_addr.s_addr =inet_addr("10.10.10.10"); //for XP
    #else
        inet_pton(AF_INET, "10.10.10.10", &inaddr.sin_addr.s_addr); //for Vista or higher
    #endif
    

    【讨论】:

      【解决方案4】:

      考虑在 Windows XP 上使用 WSAStringToAddressA 代替(WSAStartup 也是必需的)。它支持255.255.255.2550.0.0.0。它不支持字段数小于 4 的 IPv4 地址字符串。如果 WSAStringToAddressA 失败(例如 IPv4 地址字符串的字段数小于 4),则调用 inet_addr 作为备用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-12
        • 2021-05-26
        • 2017-12-08
        • 2012-01-15
        • 2011-05-09
        • 2010-10-18
        • 1970-01-01
        相关资源
        最近更新 更多