相当于 inet_aton 的 windows

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 作为备用。

【讨论】:

以上是关于相当于 inet_aton 的 windows的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中的 INET_ATON() 和 INET_NTOA()?

由 Python2 和 Python3 中 socket.inet_aton() 实现不同引发的血案

INET_NTOA 和 INET_ATON 的 PHP 等效项 [重复]

《深入理解计算机系统》关于csapp.h和csapp.c的编译问题(转)

mysql-优化二

mysql 存取ip方法