Каковы эквиваленты IP_RECVOPTS и IP_RECVRETOPTS в Windows - PullRequest
0 голосов
/ 28 января 2019

Я занимаюсь программированием сокетов, которые пытаюсь сделать кросс-платформеннымДля систем 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.  */

Inin.h этого дистрибутива, определенное значение первого, как представляется, 6, а заданное значение второго - 7.

Итак, мои вопросы:

  1. Есть ли в сокетах Windows эквивалентные константы для замены этих двух констант (или, может быть, мне просто нужно включить какой-то другой заголовок)?
  2. Если нет, возможно ли даже получение опций IP в сокетах Windows?
  3. Если да, то безопасно ли мне жестко кодировать эти значения в системах Windows соответственно 6 и 7 или они должны быть какими-то другими значениями?

ОБНОВЛЕНИЕ 1

Я продолжил свое исследование Google сегодня.Я нашел эти два интересных лакомых кусочка.Я не знаю, помогают ли они мне.Первым является заголовок Windows Runtime (WinRT) Socket Address (WinRTSockAddr.h) из репозитория MixedRealityToolkit на официальной учетной записи Microsoft GitHub .Он содержит следующее:

#define IP_RECVOPTS     6
#define IP_RETOPTS      7

Это соответствует * nix-значениям, которые я видел в других местах (я обычно видел IP_RETOPTS с псевдонимом IP_RECVRETOPTS).Но есть этот предполагаемый вспомогательный заголовок Windows Sockets из учетной записи GitHub "Geek Research Lab" .Я понятия не имею, имеет ли он какое-либо доверие, но он имеет разные значения для этих констант:

#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.: - /

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Единственный переносимый стандарт для доступа к параметрам IP (а также TCP и UDP) - через параметры вспомогательных данных sendmsg и recvmsg.

К сожалению, при наличии доступа стандартизированный, точныйсведения о доступных параметрах могут различаться в разных ОС.

В Linux см. справочную страницу cmsg и примечание:

СООТВЕТСТВИЕ СТАНДАРТАМ

Эта модель вспомогательных данных соответствует проекту POSIX.1g 4.4BSD-Lite, расширенному API IPv6, описанному в RFC 2292 и SUSv2.CMSG_ALIGN() является расширением Linux.

Для сравнения, страница руководства, описывающая IP_RECVOPTS, не имеет раздела "СООТВЕТСТВИЕ СТАНДАРТУ".

Подобные окнаСтраница документации «Параметры сокета IPPROTO_IP» для MSDN

В документации Windows для WSARecvMsg и WSASendMsg есть следующее примечание:

на основев спецификации Posix.1g для структуры msghdr

В документации для _WSAMSG перечислены вспомогательные данные, доступные в Winsock.


POSIXдокументация здесь

К сожалению для переносимости:

В системной документации должны быть указаны определения cmsg_type для поддерживаемых протоколов.

, то есть фактически доступные вспомогательные данные не являются переносимыми, поскольку они не указаны в спецификации POSIX и / или Single Unix.

0 голосов
/ 03 февраля 2019

Есть ли в сокетах Windows эквивалентные константы для замены этих двух констант (или, может быть, мне просто нужно включить какой-то другой заголовок)?

Нет.К сожалению, это не первый случай, когда Windows медленно реализует части определенного стандарта или RFC.Взглянув на параметры сокета , например, IP_RECVTTL был добавлен только недавно, для Windows 10. Так что, может быть, если вы подождете достаточно долго, вы сможете увидеть опции, которые вы хотите поддерживать в Windows?Код, который вы видели, похоже, скопирован из некоторого другого кода, отличного от Windows.В случае RakNet, обратите внимание, что WinRTSockAddr.h используется только для поддержки WINDOWS_STORE_RT, которая в настоящее время ограничена.

Если нет, возможно ли даже получение опций IP в сокетах Windows?

Нет, похоже, нет.По крайней мере, я не знаю о такой возможности.

Если это так, безопасно ли мне жестко кодировать эти значения в системах Windows соответственно 6 и 7, или они должны быть другими?значение?

Нет, возможно, небезопасно жестко кодировать значения.В лучшем случае такие значения параметров будут игнорироваться, но они могут быть неправильно истолкованы и привести к нежелательному поведению.

Поскольку вы указали, что хотите сделать свой код кроссплатформенным, вам, вероятно, придется согласиться на пересечениефункций, которые поддерживаются на всех платформах, которые вы хотите поддерживать.

...