Windows中与inet_aton函数等价的函数是什么?

12

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

4个回答

13

Windows支持inet_pton,其接口类似于inet_aton(但支持IPv6地址)。只需将AF_INET作为第一个参数提供,它就能像inet_aton一样工作。

(如果您可以更改Linux源代码,则inet_pton也可以在那里使用)。


6
但这仅适用于Vista及以上版本。在Windows XP上,它将无法加载。 - Vi.

11

这里提到的不是C++中的函数,而是Windows系统中的函数。你可能需要使用inet_addr函数,它比inet_aton早被引入,并且在Windows系统中也得到了支持。

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

在这篇文章的“相关内容”部分中,还列出了一整套用于处理IPv6地址等的详细命名函数。


一旦我使用inet_addr函数并将in_addr结构体的S_addr成员设置为返回值,那么struct in_addr的另外两个联合成员是什么呢?我不太确定这两个成员(S_un_b和S_un_w)需要设置成什么。 - SSS
我假设我可以使用sockaddr结构类型而不是sockaddr_in类型,因此不需要担心S_un_b和S_un_w...虽然我仍然想知道它们的用途。谢谢。 - SSS
1
我也不知道为什么我忽略了它是一个联合体的事实。我想不需要进一步解释了。 - SSS
联合体的其他成员是为了让你能够以字节为单位查看地址,从而对其进行某种操作。在Windows上这是有意义的,因为Windows始终使用小端序。不过,你很少需要这样做:我猜最常见的操作可能是应用网络掩码,而你并不需要字节访问。 - Steve Jessop

1
在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

0
考虑在Windows XP中使用WSAStringToAddressA代替(还需要使用WSAStartup)。它支持255.255.255.2550.0.0.0。它不支持IPv4地址字符串中字段数少于4的情况。如果WSAStringToAddressA失败(例如IPv4地址字符串的字段数少于4),则调用inet_addr作为备选方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接