在 Linux 上,netinet/in.h“应定义以下宏来测试特殊 IPv6 地址。”这包括
IN6_IS_ADDR_UNSPECIFIED
、IN6_IS_ADDR_LOOPBACK
、IN6_IS_ADDR_LINKLOCAL
、IN6_IS_ADDR_SITELOCAL
、IN6_IS_ADDR_V4MAPPED
、IN6_IS_ADDR_V4COMPAT
、IN6_IS_ADDR_MULTICAST
等宏。都非常有用。
我广泛搜索了 Windows(包括但不限于 Winsock 和 Winsock 2)文档中的类似内容,但没有找到任何类似内容。
但是后来,我偶然发现 Windows SDK 的
ws2ipdef.h
定义了一组具有相同名称和行为的函数(不是宏)(示例)。我可以在从最新到 Windows 7 的众多 Windows SDK 版本中找到它(我无法找到较旧的 Windows SDK 版本进行检查),但只能通过直接检查头文件来找到。作为仔细检查,我专门查看了 ws2ipdef.h
的文档,它或其任何子页面都没有提到任何这些功能。
此外,在谷歌上搜索这些带引号的函数名称加上“Windows”绝对不会产生任何有用或权威的结果。
所以,这让我想到两个问题:
#ifndef
块内,但它们是实际函数,所以我不能这样做。我必须按原样使用它们,或者用不同的名称重新实现它们,以防止过载错误。由于(有帮助的)评论者 Luke 和 Ron 选择发表评论而不是答案,我会将他们的评论和我自己的经验总结为答案。
我一直无法找到不包含这些镜像
netinet/in.h
宏的函数的 Windows 版本,并且它们似乎可以正常工作。 Luke 是对的,微软的文档严重缺乏,我不得不严重依赖 StackOverflow 和其他网站和博客来弄清楚如何正确使用 GetAdaptersAddresses
以及相关的函数和类型。正如卢克所说,它们是公共的内联函数,而且看起来是公平的游戏。 Ron 也说得对,其中一些宏/函数适用于已弃用的地址范围,因此应谨慎使用。在我的具体情况下,我实际上使用这些来过滤掉这些已弃用范围中的地址,使它们特别适合我。
我想说,不幸的是,微软选择将它们实现为函数而不是宏,这使得测试它们的存在(并对它们的不存在做出反应)变得不切实际,甚至不可能。