IP_PKTINFO 소켓 옵션

IP_PKTINFO 소켓 옵션을 사용하면 애플리케이션이 IPv4 소켓의 LPFN_WSARECVMSG(WSARecvMsg) 함수에 의한 패킷 정보 반환을 사용하거나 사용하지 않도록 설정할 수 있습니다.

이 소켓 옵션의 상태 쿼리하려면 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]

소켓을 식별하는 설명자입니다.

수준 [in]

옵션이 정의된 수준입니다. 이 작업에 는 IPPROTO_IP 사용합니다.

optname [in]

값을 얻거나 설정할 소켓 옵션입니다. 이 작업에는 IP_PKTINFO 사용합니다.

optval [out]

설정할 옵션의 값을 포함하는 버퍼에 대한 포인터입니다. 이 매개 변수는 DWORD 값의 크기보다 크거나 같은 버퍼를 가리킵니다.

이 값은 FALSE (사용 안 함)를 나타내는 데 0을 사용하는 부울 값과 TRUE (사용)를 나타내는 0이 아닌 값으로 처리됩니다.

optlen [in, out]

옵트발 버퍼의 크기(바이트)에 대한 포인터입니다. 이 크기는 DWORD 값의 크기와 같거나 커야 합니다.

반환 값

작업이 성공적으로 완료되면 getsockopt 또는 setsockopt 함수는 0을 반환합니다.

작업이 실패하면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEFAULT
optval 또는 optlen 매개 변수 중 하나는 사용자 주소 공간의 유효한 부분에 없는 메모리를 가리킵니다. optlen 매개 변수가 가리키는 값이 DWORD 값의 크기보다 작은 경우에도 이 오류가 반환됩니다.
WSAEINPROGRESS
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEINVAL
잘못된 인수가 지정되었습니다. 수준 매개 변수를 알 수 없거나 유효하지 않은 경우 이 오류가 반환됩니다. Windows Vista 이상에서는 소켓이 전환 상태인 경우에도 이 오류가 반환됩니다.
WSAENOPROTOOPT
옵션은 표시된 프로토콜 패밀리에서 알 수 없거나 지원되지 않습니다. 이 오류는 s 매개 변수에 전달된 소켓 설명자에 대한 형식 매개 변수가 SOCK_DGRAM 또는 SOCK_RAW 않은 경우 반환됩니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.

 

설명

IP_PKTINFO 소켓 옵션을 사용하여 호출된 getsockopt 함수를 사용하면 애플리케이션이 IPv4 소켓에 대한 LPFN_WSARECVMSG(WSARecvMsg) 함수에서 패킷 정보를 반환할지 여부를 확인할 수 있습니다.

IP_PKTINFO 소켓 옵션을 사용하여 호출된 setsockopt 함수를 사용하면 애플리케이션이 LPFN_WSARECVMSG(WSARecvMsg) 함수에 의한 패킷 정보 반환을 사용하거나 사용하지 않도록 설정할 수 있습니다. 소켓에 대한 IP_PKTINFO 옵션은 기본적으로 사용하지 않도록 설정됩니다( FALSE로 설정).

SOCK_DGRAM 또는 SOCK_RAW 형식의 IPv4 소켓에서 이 소켓 옵션을 사용하도록 설정하면 LPFN_WSARECVMSG(WSARecvMsg) 함수는 lpMsg 매개 변수가 가리키는 WSAMSG 구조체의 패킷 정보를 반환합니다. 반환된 WSAMSG 구조체의 컨트롤 데이터 개체 중 하나에는 수신된 패킷 주소 정보를 저장하는 데 사용되는 in_pktinfo 구조가 포함됩니다.

IPv4를 통해 LPFN_WSARECVMSG(WSARecvMsg) 함수에서 받은 데이터그램의 경우 수신된 WSAMSG 구조체의 Control 멤버에는 WSACMSGHDR 구조체가 포함된 WSABUF 구조체가 포함됩니다. 이 WSACMSGHDR 구조체의 cmsg_level 멤버에는 IPPROTO_IP 포함되고, 이 구조체의 cmsg_type 멤버에는 IP_PKTINFO 포함되며, cmsg_data 멤버에는 수신된 IPv4 패킷 주소 정보를 저장하는 데 사용되는 in_pktinfo 구조가 포함됩니다. in_pktinfo 구조의 IPv4 주소는 패킷이 수신된 IPv4 주소입니다.

이중 스택 데이터그램 소켓의 경우 애플리케이션에서 IPv4를 통해 받은 데이터그램에 대한 WSAMSG 구조의 패킷 정보를 반환하기 위해 LPFN_WSARECVMSG(WSARecvMsg) 함수가 필요한 경우 소켓에서 IP_PKTINFO 소켓 옵션을 true로 설정해야 합니다. 소켓에서 IPV6_PKTINFO 옵션만 true로 설정된 경우 IPv6을 통해 수신된 데이터그램에 대한 패킷 정보가 제공되지만 IPv4를 통해 수신된 데이터그램에 대해서는 제공되지 않을 수 있습니다.

애플리케이션이 이중 스택 데이터그램 소켓에서 IP_PKTINFO 소켓 옵션을 설정하려고 하고 시스템에서 IPv4를 사용하지 않도록 설정하면 setsockopt 함수가 실패하고 WSAGetLastErrorWSAEINVAL 오류와 함께 반환됩니다. 이 동일한 오류는 다른 오류의 결과로 setsockopt 함수에서도 반환됩니다. 애플리케이션이 이중 스택 소켓에서 IPPROTO_IP 수준 소켓 옵션을 설정하려고 하고 WSAEINVAL로 실패하는 경우 애플리케이션은 로컬 컴퓨터에서 IPv4를 사용하지 않도록 설정했는지 확인해야 합니다. IPv4를 사용하거나 사용하지 않도록 설정할지 여부를 감지하는 데 사용할 수 있는 한 가지 방법은 af 매개 변수가 AF_INET 설정된 소켓 함수를 호출하여 IPv4 소켓을 만드는 것입니다. 소켓 함수가 실패하고 WSAGetLastErrorWSAEAFNOSUPPORT 오류를 반환하는 경우 IPv4가 활성화되지 않음을 의미합니다. 이 경우 애플리케이션에서 IP_PKTINFO 소켓 옵션을 설정하려고 할 때 setsockopt 함수 오류가 무시될 수 있습니다. 그렇지 않으면 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)