다음을 통해 공유


IPv6 Winsock 애플리케이션용 Dual-Stack 소켓

WINDOWS XP에서 SP1(서비스 팩 1)과 Windows Server 2003에서 IPv4 및 IPv6을 모두 지원하려면 애플리케이션에서 IPv4에 사용할 소켓 1개와 IPv6에 사용할 소켓 1개 등 두 개의 소켓을 만들어야 합니다. 이러한 두 소켓은 애플리케이션에서 별도로 처리해야 합니다.

Windows Vista 이상에서는 IPv6 및 IPv4 트래픽을 모두 처리할 수 있는 단일 IPv6 소켓을 만드는 기능을 제공합니다. 예를 들어 IPv6용 TCP 수신 대기 소켓이 만들어지고 이중 스택 모드로 전환되며 포트 5001에 바인딩됩니다. 이 이중 스택 소켓은 포트 5001에 연결하는 IPv6 TCP 클라이언트와 포트 5001에 연결하는 IPv4 TCP 클라이언트의 연결을 허용할 수 있습니다. 이 기능을 사용하면 애플리케이션 디자인을 크게 간소화하고 별도의 두 소켓에 작업을 게시하는 데 필요한 리소스 오버헤드를 줄일 수 있습니다.

Dual-Stack 소켓 만들기

기본적으로 Windows Vista에서 만든 IPv6 소켓은 나중에 IPv6 프로토콜을 통해서만 작동합니다. IPv6 소켓을 이중 스택 소켓으로 만들려면 소켓이 IP 주소에 바인딩되기 전에 이 값을 0으로 설정하려면 IPV6_V6ONLY 소켓 옵션을 사용하여 setsockopt 함수를 호출해야 합니다. IPV6_V6ONLY 소켓 옵션을 0으로 설정하면 AF_INET6 주소 패밀리에 대해 만들어진 소켓을 사용하여 IPv6 주소 또는 IPv4 매핑된 주소로 패킷을 보내고 받을 수 있습니다.

Dual-Stack 소켓이 있는 IP 주소

이중 스택 소켓에는 항상 IPv6 주소가 필요합니다. IPv4 주소와 상호 작용하는 기능을 사용하려면 IPv4 매핑된 IPv6 주소 형식을 사용해야 합니다. 모든 IPv4 주소는 IPv4 노드와 통신 하는 IPv6만 애플리케이션을 사용 하도록 설정 하는 IPv4 매핑된 IPv6 주소 형식으로 표현 되어야 합니다. IPv4 매핑된 IPv6 주소 형식을 사용하면 IPv4 노드의 IPv4 주소를 IPv6 주소로 나타낼 수 있습니다. IPv4 주소는 IPv6 주소의 하위 32비트로 인코딩되고, 상위 96비트에는 고정 접두사 0:0:0:0:0:FFFF가 있습니다. IPv4 매핑된 IPv6 주소 형식은 RFC 4291에 지정됩니다. 자세한 내용은 www.ietf.org/rfc/rfc4291.txt참조하세요. Mstcpip.h의 IN6ADDR_SETV4MAPPED 매크로를 사용하여 IPv4 주소를 필요한 IPv4 매핑 IPv6 주소 형식으로 변환할 수 있습니다.

기본 프로토콜이 실제로 IPv4인 경우 IPv4 주소는 IPv4 매핑된 IPv6 주소 형식으로 매핑됩니다. 즉, SOCKADDR 구조의 패밀리 필드는 AF_INET6 나타내지만 IPv4 매핑된 IPv6 주소는 IPv6 주소 구조로 인코딩됩니다. 수신 모드의 이중 스택 소켓의 경우 허용된 모든 IPv4 연결이 IPv4 매핑된 IPv6 주소를 반환합니다. IPv4 대상에 연결하는 이중 스택 소켓의 경우 연결에 전달된 SOCKADDR 구조체는 IPv4 매핑된 IPv6 주소여야 합니다. 애플리케이션은 이러한 IPv4 매핑된 IPv6 주소를 적절하게 처리하고 이중 스택 소켓에서만 사용해야 합니다. IP 주소를 일반 IPv4 소켓에 전달하려면 주소가 IPv4 매핑된 IPv6 주소가 아닌 일반 IPv4 주소여야 합니다.

Dual-Stack 소켓을 사용하는 잠재적 문제

애플리케이션에 대한 잠재적인 문제는 이중 스택 소켓에서 IPv4 매핑된 IPv6 주소를 가져오고 다른 IPv6 전용 소켓에서 반환된 IP 주소를 사용하려고 하는 것입니다. 예를 들어 getsockname 또는 getpeername 함수는 이중 스택 소켓에서 사용할 때 IPv4 매핑된 IPv6 주소를 반환할 수 있습니다. 반환된 IPv4 매핑된 IPv6 주소가 나중에 이중 스택(소켓을 만들 때 기본 동작인 IPv6 전용 소켓)으로 설정되지 않은 다른 소켓에서 사용되는 경우 IPv4 매핑된 IPv6 주소와 함께 이 IPv6 전용 소켓을 사용하지 못합니다. IPv4 매핑된 IPv6 주소 형식은 이중 스택 소켓에서만 사용할 수 있습니다.

이중 스택 데이터그램 소켓에서 애플리케이션에서 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 소켓 옵션을 설정하려고 할 때 오류가 예기치 않은 오류로 처리되어야 합니다.

WSASendMsg 함수 및 애플리케이션이 사용할 특정 로컬 IP 원본 주소를 지정하려는 데이터그램을 보낼 때 이중 스택 소켓의 경우 이를 처리하는 방법은 대상 IP 주소에 따라 달라집니다. IPv4 대상 주소 또는 IPv4 매핑된 IPv6 대상 주소로 보낼 때 lpMsg 매개 변수가 가리키는 WSAMSG 구조에 전달된 컨트롤 데이터 개체 중 하나에는 전송에 사용할 로컬 IPv4 원본 주소가 포함된 in_pktinfo 구조가 포함되어야 합니다. IPv4 매핑된 IPv6 주소가 아닌 IPv6 대상 주소로 보낼 때 lpMsg 매개 변수가 가리키는 WSAMSG 구조에 전달된 컨트롤 데이터 개체 중 하나에는 전송에 사용할 로컬 IPv6 원본 주소가 포함된 in6_pktinfo 구조체가 포함되어야 합니다.

Windows 소켓 애플리케이션용 IPv6 가이드

IPv6 Winsock Appications에 대한 데이터 구조 변경

IPv6 Winsock 애플리케이션에 대한 함수 호출

하드 코딩된 IPv4 주소 사용

IPv6 Winsock 애플리케이션에 대한 사용자 인터페이스 문제

IPv6 Winsock 애플리케이션에 대한 기본 프로토콜

getpeername

getsockname

in_pktinfo

in6_pktinfo

IP_PKTINFO

IPV6_PKTINFO

setsockopt

LPFN_WSARECVMSG (WSARecvMsg)

WSASendMsg