문제

현재 UDP 소켓 애플리케이션에서 작업하고 있으며 IPv4 및 IPv6 연결이 패킷을 서버로 보낼 수 있도록 지원을 구축해야합니다.

나는 누군가가 나를 도와주고 나를 올바른 방향으로 가리킬 수 있기를 바랐다. 내가 찾은 문서의 대부분은 완성되지 않았습니다. Winsock과 BSD 소켓의 차이점을 지적 할 수 있다면 도움이 될 것입니다.

미리 감사드립니다!

도움이 되었습니까?

해결책

가장 좋은 방법은 IPv4 연결을 수용 할 수있는 IPv6 서버 소켓을 만드는 것입니다. 그렇게하려면 일반 IPv6 소켓을 만들고 회전하십시오. 끄다 소켓 옵션 IPV6_V6ONLY, "모든"주소에 바인딩하고 수신을 시작하십시오. IPv4 주소는 IPv6 주소로 제시됩니다. IPv4 맵핑 체재.

시스템의 주요 차이점은 여부입니다 IPV6_V6ONLY a) 사용 가능하고 b) 기본적으로 켜거나 끕니다. Linux에서 기본적으로 꺼져 있으며 (즉, Setsockopt없이 듀얼 스택 소켓을 허용 함) 대부분의 다른 시스템에서 켜집니다.

또한 Windows XP의 IPv6 스택은 해당 옵션을 지원하지 않습니다. 이 경우 두 개의 별도 서버 소켓을 만들어 선택 또는 여러 스레드에 배치해야합니다.

다른 팁

소켓 API는 IETF RFC에 의해 관리되며 Windows WRT IPv6을 포함한 모든 플랫폼에서 동일해야합니다.

IPv4/IPv6 응용 프로그램의 경우입니다 모두 ~에 대한 getaddrinfo() 그리고 getnameinfo(). getaddrinfo 천재입니까? 고객의 DNS, 포트 이름 및 기능을보고“IPv4, IPv6 또는 둘 다를 사용하여 특정 목적지에 도달 할 수 있습니까?”라는 영원한 질문을 해결합니다. 또는 듀얼 스택 경로로 가서 IPv4- 맵핑 된 IPv6 주소를 반환하려면 그렇게 할 것입니다.

직접적인 것을 제공합니다 sockaddr * 연결할 수있는 구조 bind(), recvfrom(), sendto() 그리고 주소 패밀리 socket()… 많은 경우에 이것은 지저분한 것을 의미하지 않습니다 sockaddr_in(6) 작성하고 처리 할 구조.

UDP 구현의 경우 듀얼 스택 소켓을 설정하거나보다 일반적으로 모든 인터페이스에 바인딩하는 데주의를 기울일 것입니다.INADDR_ANY). 고전적인 문제는 주소가 잠겨 있지 않을 때 ( bind()) 특정 인터페이스와 시스템에는 여러 인터페이스 요청이 있으며, OS 라우팅 테이블의 WHIM을 기반으로 여러 주소가있는 컴퓨터의 다른 주소, 특히 인증 요구 사항이있는 모든 시스템을 혼동하는 컴퓨터의 다른 주소에서 응답이 전송 될 수 있습니다.

문제가되지 않는 UDP 구현의 경우 TCP의 경우 듀얼 스택 소켓을 사용하면 IPV*가 시스템을 활성화 할 때 많은 시간을 절약 할 수 있습니다. 듀얼 스택 소켓이없는 IPv6 스택으로 배포 된 합리적인 플랫폼 (Old Linux, BSD, Windows 2003)이 부족하지 않기 때문에 절대적으로 필요하지 않기 때문에 절대적으로 필요하지 않기 때문에 절대적으로 필요하지 않은 듀얼 스택에 전적으로 의존하지 않아야합니다.

나는 이것을 Windows에서 가지고 놀았는데 실제로 루프백 주소에 바인딩하면 IPv6 소켓이 [:: 1]에 올바르게 바인딩되지만 매핑 된 IPv4 소켓은 inaddr_any에 바인딩됩니다. , 당신의 안전하게 로컬 전용 앱은 실제로 세계에 노출되어 있습니다.

RFC는 실제로 IPv6_v6only 소켓 옵션의 존재를 지정하지는 않지만, 결석이없는 경우 RFC는 해당 옵션이 거짓 인 것처럼 구현이 있어야한다는 것이 분명합니다.

옵션이있는 경우, 기본값이 허위로되어 있어야한다고 주장하지만, 이해를 전달하는 이유는 BSD와 Windows 구현 기본값을 true합니다. 알지 못하는 IPv6 프로그래머가 IPv6에 대해서만 IN6ADDR_ANY에만 구속력이 있다고 생각하고 실수로 보안 문제를 일으키는 IPv4 연결을 수락한다고 생각할 수 있기 때문에 이것은 보안 문제라고 기괴한 주장이 있습니다. 나는 이것이 RFC 호환 구현을 기대하는 사람에게 놀라움과 더불어는 멀리 떨어져 있고 터무니없는 것이라고 생각합니다.

Windows의 경우 비 협력은 일반적으로 놀라운 일이 아닙니다. BSD의 경우, 이것은 불행한 일입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top