Windows中IP_RECVOPTS和IP_RECVRETOPTS的等效项是什么

时间:2019-01-28 14:22:57

标签: c windows sockets winsock2

我正在做一些套接字编程,试图使跨平台兼容。对于Windows系统,我包含以下标题:

#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。

所以,我的问题:

  1. Windows套接字中是否存在用于替换这两个常量的等效常量(或者也许我只需要包含其他标头)?
  2. 如果没有,是否甚至可以在Windows套接字中接收IP选项?
  3. 如果是这样,我可以安全地将Windows系统上的这些值分别硬编码为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_RETOPTSIP_RECVRETOPTS的别名。 :-/

2 个答案:

答案 0 :(得分:1)

访问IP(以及TCP和UDP)选项的唯一有点可移植的标准是通过sendmsgrecvmsg的辅助数据参数。

不幸的是,虽然访问权限已标准化,但各操作系统之间有关可用选项的确切详细信息仍然会有所不同。

在Linux上,请参见cmsg man page并注意:

  

符合

     

此辅助数据模型符合POSIX.1g草案4.4BSD-          Lite,RFC 2292和SUSv2中描述的IPv6高级API。          CMSG_ALIGN()是Linux扩展。

相比之下,the man page describing IP_RECVOPTS没有“符合”部分。

类似的Windows文档页面为"IPPROTO_IP Socket Options" on MSDN

在Windows文档WSARecvMsgWSASendMsg中,有以下注意事项:

  

基于msghdr结构的Posix.1g规范

_WSAMSG的文档列出了Winsock可获得的辅助数据。


POSIX文档为here

不幸的是,由于可移植性:

  

系统文档应为受支持的协议指定 cmsg_type 定义。

也就是说,实际可用的辅助数据不是可移植的,因为POSIX和/或Single Unix规范没有指定这些数据。

答案 1 :(得分:-1)

  

Windows套接字中是否存在用于替换这些常量的等效常量   两个常数(或者,也许我只需要包含一些其他标头)?

不。不幸的是,这并不是Windows第一次缓慢实施特定标准或RFC的某些部分。以socket options为例,IP_RECVTTL是最近才添加到Windows 10的。那么,也许等了很长时间,您可能会发现自己想要Windows支持的选项吗?您所看到的代码似乎是从其他一些非Windows代码复制粘贴而成的。在RakNet的情况下,请注意,WinRTSockAddr.h仅用于WINDOWS_STORE_RT的支持,这是目前的限制。

  

如果没有,甚至可以在Windows中接收IP选项   插座?

不,似乎不是。至少我不知道这种能力。

  

如果是这样,对我来说在Windows系统上对这些值进行硬编码是否安全?   分别为6和7,还是应该为其他值?

没有,它可能不是安全的硬编码值。充其量,此类选项值将被忽略,但可能会被误解并导致不良行为。

由于您已指出要使代码跨平台,因此您可能必须满足所有要支持的平台所支持的功能的交叉要求。