문제

이 질문은 자매 질문으로 취급 될 수 있습니다. 이전 나 자신에 의해 게시 됨. 링크 로컬 주소를 IPv6 소켓에 바인딩하려면 sin6_scope_id 의장 sockaddr_in6 구조. 누군가가 모범 사례에 따라 솔루션을 제공 할 수 있는지 궁금합니다.

도움이 되었습니까?

해결책

IPv6 링크-로컬 주소는 노드에서 고유하지 않으며 NIC에 대해서만 고유하므로 SCOPE-ID를 지정해야합니다. 즉, 정확히 동일한 IPv6 주소를 가진 여러 어댑터를 갖는 것이 완벽하게 유효합니다.

이것은 당신이 전달할 수있는 스코프 ID 또는 적절한 텍스트 양식 ( %eth0, %1)을 입력해야한다는 것을 의미합니다. getaddrinfo().

한 가지 방법은 IPv6 링크-로컬 주소를 사용하여 인터페이스를 열거하고 하나의 일치 만 사용하는 경우 하나 이상의 일치하는 경우 인터페이스 목록과 함께 구제하고 사용자가 전체 형태의 전체 형식을 지정하도록하는 것입니다.

다른 팁

이 문제는 링크 로컬 주소를 하드 코딩 할 때만 발생하며, 이는 실제로 사소한 앱을위한 실용적인 솔루션이 아닙니다.

그렇지 않으면, 당신은 당신의 것을 얻어야합니다 sockaddr 묶음 getifaddrs(), 이는 귀하를위한 범위 ID를 작성합니다 (예 : 사용자가 인터페이스 이름을 지정할 수있게 한 다음 다음으로 반환 된 목록을 검색 할 수 있습니다. getifaddrs() 해당 인터페이스와 관련된 링크-로컬 주소를 찾으려면).

IPv6 링크-로컬 주소의 경우 (fe80::/10 접두사), the sin6_scope_id 회원 sockaddr_in6 구조는 인터페이스 번호 이며이 번호를

if_nametoindex(const char *ifname);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top