2013-07-01 56 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