Параметр сокета 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.
Код ошибки | Значение |
---|---|
Перед использованием этой функции должен быть выполнен успешный вызов WSAStartup . |
|
Произошел сбой сетевой подсистемы. |
|
Один из параметров optval или optlen указывает на память, которая не находится в допустимой части адресного пространства пользователя. Эта ошибка также возвращается, если значение, указываемое параметром optlen , меньше размера значения DWORD . |
|
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова. |
|
Указан недопустимый аргумент. Эта ошибка возвращается, если параметр уровня неизвестен или недопустим. В Windows Vista и более поздних версиях эта ошибка также возвращается, если сокет находился в переходном состоянии. |
|
Параметр неизвестен или не поддерживается указанным семейством протоколов. Эта ошибка возвращается, если параметр типа для дескриптора сокета, переданный в параметре s , не был SOCK_DGRAM или не SOCK_RAW. |
|
Дескриптор не является сокетом. |
Комментарии
Функция 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 [только классические приложения] |
Заголовок |
|
См. также раздел