Windows 中 IP_RECVOPTS 和 IP_RECVRETOPTS 的等价物是什么
What are the equivalents of IP_RECVOPTS and IP_RECVRETOPTS in Windows
我正在做一些套接字编程,试图使 cross-platform 兼容。对于 Windows 系统,我包括以下 headers:
#include <winsock2.h>
#include <ws2tcpip.h>
当我试图在 Windows 上编译我的应用程序时,我得到关于以下常量未定义的错误:
IP_RECVOPTS
IP_RECVRETOPTS
我觉得很奇怪,因为我认为这些是很常见的套接字选项,但也许我错了。无论哪种方式,果然,它们没有在 Windows 套接字文档中的任何地方列出。
Linux 发行版 in.h
中的文档对这些常量的说明如下:
IP_RECVOPTS /* bool; Receive all IP options w/datagram. */
IP_RECVRETOPTS /* bool; Receive IP options for response. */
在该发行版的 in.h
中,第一个的定义值似乎是 6,而第二个的定义值似乎是 7。
所以,我的问题:
- 在 Windows 套接字中是否有等效的常量来替换这两个常量(或者,也许我只需要包括一些其他的 header)?
- 如果不是,是否可以在 Windows 套接字中接收 IP 选项?
- 如果是这样,我将 Windows 系统上的这些值分别 hard-code 为 6 和 7 是否安全,或者它们应该是其他值?
更新 1
我今天继续 Google 研究。我发现了这两个有趣的花絮。我不知道他们是否帮助我。第一个是 Windows Runtime (WinRT) Socket Address header (WinRTSockAddr.h
) from the MixedRealityToolkit
repository on Microsoft's official GitHub account。它包含以下内容:
#define IP_RECVOPTS 6
#define IP_RETOPTS 7
这与我在其他地方看到的 *nix 值一致(我经常看到 IP_RETOPTS
别名为 IP_RECVRETOPTS
)。但是还有 this alleged Windows Sockets helper header from the "Geek Research Lab"'s GitHub account。我不知道它是否有任何可信度,但它对这些常量有不同的值:
#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */
#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */
#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */
#define IP_RETOPTS 8 /* ip_opts; set/get IP options */
这在所有方面都是矛盾的:值和 IP_RETOPTS
到 IP_RECVRETOPTS
的别名。 :-/
Are there equivalent constants in Windows sockets for replacing these
two constants (or, perhaps, do I just need to include some other header)?
没有。不幸的是,这不是第一次 Windows 执行特定标准或 RFC 的部分内容很慢。看看 socket options,例如,IP_RECVTTL
是最近才添加的,因为 Windows 10。所以也许如果你等得够久,你可能会看到你想要支持的选项Windows?您看到的代码似乎是从其他一些非 Windows 代码复制粘贴而来的。在 RakNet 的情况下,请注意 WinRTSockAddr.h
仅用于 WINDOWS_STORE_RT
支持,目前是有限的。
If not, is the receiving of IP options even possible in Windows
sockets?
不,好像不是。至少我不知道有这种能力。
If so, is it safe for me to hard-code these values on Windows systems
to 6 and 7, respectively, or should they be some other value?
不,对值进行硬编码可能不安全。充其量,此类选项值会被忽略,但它们可能会被误解并导致不良行为。
既然您表示您的目标是使您的代码跨平台,您可能不得不满足于在您想要支持的所有平台上支持的功能的交集。
访问 IP(以及 TCP 和 UDP)选项的唯一可移植标准是通过 sendmsg
和 recvmsg
的辅助数据参数。
不幸的是,虽然访问是标准化的,但可用选项的具体细节仍然因操作系统而异。
在 Linux 上,查看 cmsg man page 并注意:
CONFORMING TO
This ancillary data model conforms to the POSIX.1g draft, 4.4BSD-
Lite, the IPv6 advanced API described in RFC 2292 and SUSv2.
CMSG_ALIGN()
is a Linux extension.
相比之下,the man page describing IP_RECVOPTS
没有 "CONFORMING TO" 部分。
类似的 Windows 文档页面是 "IPPROTO_IP Socket Options" on MSDN
在 WSARecvMsg
和 WSASendMsg
的 Windows 文档中,有以下说明:
based on the Posix.1g specification for the msghdr structure
_WSAMSG
的文档列出了可从 Winsock 获得的辅助数据。
POSIX 文档是 here
遗憾的是便携性:
The system documentation shall specify the cmsg_type definitions for the supported protocols.
也就是说,实际可用的辅助数据是不可移植的,因为它没有被 POSIX and/or Single Unix Specification 指定。
我正在做一些套接字编程,试图使 cross-platform 兼容。对于 Windows 系统,我包括以下 headers:
#include <winsock2.h>
#include <ws2tcpip.h>
当我试图在 Windows 上编译我的应用程序时,我得到关于以下常量未定义的错误:
IP_RECVOPTS
IP_RECVRETOPTS
我觉得很奇怪,因为我认为这些是很常见的套接字选项,但也许我错了。无论哪种方式,果然,它们没有在 Windows 套接字文档中的任何地方列出。
Linux 发行版 in.h
中的文档对这些常量的说明如下:
IP_RECVOPTS /* bool; Receive all IP options w/datagram. */
IP_RECVRETOPTS /* bool; Receive IP options for response. */
在该发行版的 in.h
中,第一个的定义值似乎是 6,而第二个的定义值似乎是 7。
所以,我的问题:
- 在 Windows 套接字中是否有等效的常量来替换这两个常量(或者,也许我只需要包括一些其他的 header)?
- 如果不是,是否可以在 Windows 套接字中接收 IP 选项?
- 如果是这样,我将 Windows 系统上的这些值分别 hard-code 为 6 和 7 是否安全,或者它们应该是其他值?
更新 1
我今天继续 Google 研究。我发现了这两个有趣的花絮。我不知道他们是否帮助我。第一个是 Windows Runtime (WinRT) Socket Address header (WinRTSockAddr.h
) from the MixedRealityToolkit
repository on Microsoft's official GitHub account。它包含以下内容:
#define IP_RECVOPTS 6
#define IP_RETOPTS 7
这与我在其他地方看到的 *nix 值一致(我经常看到 IP_RETOPTS
别名为 IP_RECVRETOPTS
)。但是还有 this alleged Windows Sockets helper header from the "Geek Research Lab"'s GitHub account。我不知道它是否有任何可信度,但它对这些常量有不同的值:
#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */
#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */
#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */
#define IP_RETOPTS 8 /* ip_opts; set/get IP options */
这在所有方面都是矛盾的:值和 IP_RETOPTS
到 IP_RECVRETOPTS
的别名。 :-/
Are there equivalent constants in Windows sockets for replacing these two constants (or, perhaps, do I just need to include some other header)?
没有。不幸的是,这不是第一次 Windows 执行特定标准或 RFC 的部分内容很慢。看看 socket options,例如,IP_RECVTTL
是最近才添加的,因为 Windows 10。所以也许如果你等得够久,你可能会看到你想要支持的选项Windows?您看到的代码似乎是从其他一些非 Windows 代码复制粘贴而来的。在 RakNet 的情况下,请注意 WinRTSockAddr.h
仅用于 WINDOWS_STORE_RT
支持,目前是有限的。
If not, is the receiving of IP options even possible in Windows sockets?
不,好像不是。至少我不知道有这种能力。
If so, is it safe for me to hard-code these values on Windows systems to 6 and 7, respectively, or should they be some other value?
不,对值进行硬编码可能不安全。充其量,此类选项值会被忽略,但它们可能会被误解并导致不良行为。
既然您表示您的目标是使您的代码跨平台,您可能不得不满足于在您想要支持的所有平台上支持的功能的交集。
访问 IP(以及 TCP 和 UDP)选项的唯一可移植标准是通过 sendmsg
和 recvmsg
的辅助数据参数。
不幸的是,虽然访问是标准化的,但可用选项的具体细节仍然因操作系统而异。
在 Linux 上,查看 cmsg man page 并注意:
CONFORMING TO
This ancillary data model conforms to the POSIX.1g draft, 4.4BSD- Lite, the IPv6 advanced API described in RFC 2292 and SUSv2.
CMSG_ALIGN()
is a Linux extension.
相比之下,the man page describing IP_RECVOPTS
没有 "CONFORMING TO" 部分。
类似的 Windows 文档页面是 "IPPROTO_IP Socket Options" on MSDN
在 WSARecvMsg
和 WSASendMsg
的 Windows 文档中,有以下说明:
based on the Posix.1g specification for the msghdr structure
_WSAMSG
的文档列出了可从 Winsock 获得的辅助数据。
POSIX 文档是 here
遗憾的是便携性:
The system documentation shall specify the cmsg_type definitions for the supported protocols.
也就是说,实际可用的辅助数据是不可移植的,因为它没有被 POSIX and/or Single Unix Specification 指定。