2011-06-14 3 views
3

IPV4 및 IPV6을 지원하는 듀얼 스택 모드를 구현 중입니다. IPV6 소켓을 생성하고 수신하는 경우 IPv4 소켓과의 연결도 수락합니까?IPV6 소켓 생성

답변

3

운영 체제가 달리 구성되어 있지 않으면 예. Linux에서 net.ipv6.bindv6only=1을 입력하거나 IPV6_V6ONLY 소켓 옵션을 설정합니다.

+0

.NET에서 명시 적으로'SocketOptionName.IPv6Only'을'false'로 설정해야한다는 것을 눈치 챘습니다. 그렇지 않으면 IPv6 소켓에서 IPv4 연결을 수락하지 않을 것입니다. 예 :'listener_socket.SetSocketOption (SocketOptionLevel.IPv6, SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);' –

2

시스템에 dual-stack 구현이있는 경우에만. 대부분의 최신 시스템이 그렇지만 Windows와 OpenBSD의 구버전은 그렇지 않습니다. 당신은 이것에 의지해서는 안됩니다. IPV6_V6ONLY 소켓 옵션의 값을 가져오고, 0 일 경우 IPv4 용 두 번째 소켓을 열어야합니다.

이중 스택 소켓을 사용하는 경우 IPv4 주소는 ::ffff:[IPv4 address]으로 표시됩니다. 예 : ::ffff:127.0.0.1 (이것은 ::ffff:7f00:1에 해당하며 일반적으로 읽을 수있는 점은 10 진수로 표기됩니다).

+0

@spencercw ...하지만 ipv6 소켓에서 연결을 만들고 받아들이는 동안 우리는 sockaddr_in6 구조와 크기를 전달해야합니다. 그래서, 그것은 변화를 가져 오지 않을 것입니다. 그리고 IPV6_V6ONLY 값을 설정하는 방법. 코드에서 이해하는 방법을 설명해 주시겠습니까? 이것을 setsocketoption에 전달해야합니까 ?? –

+0

IPv6 전용 옵션을 변경하지 않으려 고합니다. 사용 가능한 경우 이중 스택 기능을 사용하십시오. 이중 스택 기능이없는 경우에만 IPv4 용 두 번째 소켓을 엽니 다. 옵션의 가치를 얻으려면 [getsockopt()] (http://linux.die.net/man/3/getsockopt)를 사용해야합니다. – spencercw

1

Microsoft에 의하면, 듀얼 스택 모드에서 기본값은 false로 IPV6_V6ONLY 세트를 가지고하는 것입니다 -하지만 당신은 setsockopt를 (2) 호출을 통해 활성화 할 수 있습니다. FWIW, Windows의 "이전 버전"(단일 스택)에는 여전히 널리 사용되는 Windows XP (Vista 이전)가 포함됩니다.

Windows를 사용하는 경우 IPV6_V6ONLY를 비활성화하고 사용 중지되었는지 확인해야합니다. 다른 싱글 스택 구현을위한 좋은 대답인지 아닌지는 잘 모르겠습니다.