Поделиться через


Параметр сокета IP_PKTINFO

Параметр сокета IP_PKTINFO позволяет приложению включать или отключать возврат сведений о пакетах функцией LPFN_WSARECVMSG (WSARecvMsg) в сокете IPv4.

Чтобы запросить состояние этого параметра сокета, вызовите функцию getsockopt . Чтобы задать этот параметр, вызовите функцию setsockopt со следующими параметрами.

Значение параметра сокета

Константой, представляющей этот параметр сокета, является 19.

Синтаксис

int getsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) IPPROTO_IP,   // level
  (int) IP_PKTINFO, // optname
  (char *) optval, // output buffer,
  (int) optlen,  // size of output buffer
);
int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) IPPROTO_IP,   // level
  (int) IP_PKTINFO, // optname
  (char *) optval, // input buffer,
  (int) optlen,  // size of input buffer
);

Параметры

s [in]

Дескриптор, определяющий сокет.

level [in]

Уровень, на котором определен параметр. Для этой операции используйте IPPROTO_IP .

optname [in]

Параметр сокета, для которого необходимо получить или задать значение. Для этой операции используйте IP_PKTINFO.

optval [out]

Указатель на буфер, содержащий значение заданного параметра. Этот параметр должен указывать на буфер, равный или превышающий размер значения DWORD .

Это значение обрабатывается как логическое значение с 0, которое используется для обозначения FALSE (отключено), а ненулевое значение — значение TRUE (включено).

optlen [in, out]

Указатель на размер буфера optval в байтах. Этот размер должен быть равен или больше размера значения DWORD .

Возвращаемое значение

Если операция завершается успешно, функция getsockopt или setsockopt возвращает ноль.

Если операция завершается сбоем, возвращается значение SOCKET_ERROR и можно получить определенный код ошибки, вызвав WSAGetLastError.

Код ошибки Значение
WSANOTINITIALISED
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup .
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAEFAULT
Один из параметров optval или optlen указывает на память, которая не находится в допустимой части адресного пространства пользователя. Эта ошибка также возвращается, если значение, указываемое параметром optlen , меньше размера значения DWORD .
WSAEINPROGRESS
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAEINVAL
Указан недопустимый аргумент. Эта ошибка возвращается, если параметр уровня неизвестен или недопустим. В Windows Vista и более поздних версиях эта ошибка также возвращается, если сокет находился в переходном состоянии.
WSAENOPROTOOPT
Параметр неизвестен или не поддерживается указанным семейством протоколов. Эта ошибка возвращается, если параметр типа для дескриптора сокета, переданный в параметре s , не был SOCK_DGRAM или не SOCK_RAW.
WSAENOTSOCK
Дескриптор не является сокетом.

 

Комментарии

Функция getsockopt , вызываемая с параметром сокета IP_PKTINFO, позволяет приложению определить, должна ли функция LPFN_WSARECVMSG (WSARecvMsg) возвращать сведения о пакете для сокета IPv4.

Функция setsockopt, вызываемая с параметром сокета IP_PKTINFO, позволяет приложению включать или отключать возврат сведений о пакетах функцией LPFN_WSARECVMSG (WSARecvMsg). Параметр IP_PKTINFO для сокета по умолчанию отключен (имеет значение FALSE).

Если этот параметр сокета включен для сокета IPv4 типа SOCK_DGRAM или SOCK_RAW, функция LPFN_WSARECVMSG (WSARecvMsg) возвращает сведения о пакете в структуре WSAMSG , на которую указывает параметр lpMsg . Один из объектов данных управления в возвращаемой структуре WSAMSG будет содержать in_pktinfo структуру, используемую для хранения сведений об адресе полученного пакета.

Для датаграмм, полученных функцией LPFN_WSARECVMSG (WSARecvMsg) по протоколу IPv4, элемент Control полученной структуры WSAMSG будет содержать структуру WSABUF , содержащую структуру WSACMSGHDR . Элемент cmsg_level этой структуры WSACMSGHDR будет содержать IPPROTO_IP, элемент cmsg_type этой структуры будет содержать IP_PKTINFO, а элемент cmsg_data будет содержать in_pktinfo структуру, используемую для хранения сведений об адресе полученного пакета IPv4. IPv4-адрес в структуре in_pktinfo — это IPv4-адрес, с которого был получен пакет.

Для сокета датаграмм с двумя стеками, если приложению требуется функция LPFN_WSARECVMSG (WSARecvMsg) для возврата сведений о пакете в структуре WSAMSG для датаграмм, полученных по протоколу IPv4, IP_PKTINFO параметр сокета должен иметь значение true в сокете. Если в сокете задано значение true только для параметра IPV6_PKTINFO , сведения о пакетах будут предоставляться для датаграмм, полученных по протоколу IPv6, но могут не предоставляться для датаграмм, полученных по протоколу IPv4.

Если приложение пытается задать параметр сокета IP_PKTINFO в сокете datagram с двойным стеком и протокол IPv4 отключен в системе, функция setockopt завершится ошибкой и WSAGetLastError вернет ошибку WSAEINVAL. Эта же ошибка также возвращается функцией setsockopt в результате других ошибок. Если приложение пытается задать параметр сокета уровня IPPROTO_IP в сокете с двойным стеком и завершается сбоем при использовании WSAEINVAL, приложение должно определить, отключен ли протокол IPv4 на локальном компьютере. Один из способов, который можно использовать для определения того, включен или отключен протокол IPv4, заключается в вызове функции сокета с параметром af , для AF_INET для создания сокета IPv4. Если функция сокета завершается сбоем и WSAGetLastError возвращает ошибку WSAEAFNOSUPPORT, это означает, что протокол IPv4 не включен. В этом случае сбой функции setsockopt при попытке задать параметр сокета IP_PKTINFO может быть проигнорирован приложением. В противном случае сбой при попытке задать параметр сокета IP_PKTINFO следует рассматривать как непредвиденную ошибку.

Обратите внимание, что файл заголовка Ws2ipdef.h автоматически включается в Ws2tcpip.h и никогда не должен использоваться напрямую.

Требования

Требование Значение
Минимальная версия клиента
Windows XP [только классические приложения]
Минимальная версия сервера
Windows Server 2003 [только классические приложения]
Заголовок
Ws2ipdef.h (включая Ws2tcpip.h)

См. также раздел

Сокеты с двойным стеком

getsockopt

in_pktinfo

Параметры сокета IPPROTO_IP

IPV6_PKTINFO

setsockopt

Сокета

WSAMSG

LPFN_WSARECVMSG (WSARecvMsg)