2013-07-01 2 views
-2

ipv6 이중 스택 모드에서 서버를 실행하려고합니다. 코드 내에서 ipv6 모듈이로드 된 경우 이중 스택 모드에서 실행하거나 ipv6이 활성화되지 않은 경우 일반 모드에서 실행되도록 결정해야합니다. 모듈이 커널에로드되었는지 쿼리하는 방법이 있습니까?IPV6 이중 스택 모드 검사가 ipv6 커널 모듈이로드되었습니다.

에 정의 된 query_module() api를 사용하여 모듈 정보를 가져 오려고합니다. query_module은 커널 2.6 이하에서만 지원됩니다. 특정 모듈이로드되었는지 여부를 쿼리하는 대체 방법은 무엇입니까?

다른 방법이 있습니까?

당신이 다른 모듈에서 내 응용 프로그램에서 만든 여러 서버 소켓이며 듀얼 스택 모드 대신 결합 된 스타일로 전환하기 전에 글로벌 수표를 가지고

+2

IPv6 소켓을 만들어서 얻는 지 확인할 수도 있습니다. –

+0

문제는 동일한 포트를 사용해야한다는 것입니다. 듀얼 스택 모드는이 문제를 해결합니다. – Srikan

+1

모듈이로드되었는지 여부를 묻는 질문은 ipv6을 모듈이 아닌 커널에 직접 컴파일 할 수 있기 때문에 바람직하지 않습니다. – youdontneedtothankme

답변

-1

감사드립니다.

union usockaddr { 
     struct sockaddr sa; 
     struct sockaddr_in sin; 
     struct sockaddr_in6 sin6; 
    }; 

is_ipv6_enabled() 
{   
     SOCKET tsock; 
     union usockaddr socketaddr;  
     int on=1; 
     static int checked = -1; 

     if(checked != -1) 
      return checked; 

     memset(&socketaddr, 0, sizeof(socketaddr)); 
     socketaddr.sin6.sin6_family = AF_INET6; 
     socketaddr.sin6.sin6_port = htons((uint16_t)0); // Random port 
     socketaddr.sin6.sin6_addr = in6addr_any; 


     if((tsock = socket(socketaddr.sa.sa_family, SOCK_STREAM, 6)) == INVALID_SOCKET || 
      setsockopt(tsock, SOL_SOCKET, SO_REUSEADDR, (const char *) &on, sizeof(on)) != 0 || 
      bind(tsock, &socketaddr.sa, sizeof(socketaddr)) != 0 || 
      listen(tsock,SOMAXCONN) != 0){ 
       checked = 0; 
     } 
     else { 
      checked = 1; 
     } 

     closesocket(tsock); 

     return checked; 
} 
+0

질문과 대답의 문제점을 설명해주십시오. 더 나은 해결책이 있다면 설명해주십시오. 모든 이전 사용자에게 이전 포트에 대해서만 알고있는 이전 제품을 버리라고 요청하는 것을 원하지 않습니다. – Srikan