我試圖在ipv6雙棧模式下運行我的服務器。在代碼中,如果ipv6模塊已加載,則需要做出雙棧模式下運行的決策;如果未啓用ipv6,則需要在正常模式下運行。有沒有辦法查詢模塊是否加載到內核中。IPV6雙棧模式檢查是加載了ipv6內核模塊
我想使用query_module()api中定義的模塊信息。它看起來像query_module僅在內核2.6和以下版本中受支持。查詢特定模塊是否加載的替代方法是什麼?
有沒有其他方法可以實現這一目標?
謝謝
我試圖在ipv6雙棧模式下運行我的服務器。在代碼中,如果ipv6模塊已加載,則需要做出雙棧模式下運行的決策;如果未啓用ipv6,則需要在正常模式下運行。有沒有辦法查詢模塊是否加載到內核中。IPV6雙棧模式檢查是加載了ipv6內核模塊
我想使用query_module()api中定義的模塊信息。它看起來像query_module僅在內核2.6和以下版本中受支持。查詢特定模塊是否加載的替代方法是什麼?
有沒有其他方法可以實現這一目標?
謝謝
有在不同的模塊在我的應用程序中創建多個服務器插座和開關,以舊風格,而不是結合雙棧模式之前,有一個全球性的檢查。
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;
}
請解釋問題和答案有什麼問題?如果你有更好的解決方案,請解釋一下。我不想讓我以前的所有用戶轉載只知道舊端口的舊產品。 – Srikan
你也可以嘗試創建一個IPv6套接字,看看你是否得到了一個。 –
問題是,我需要使用相同的端口。雙堆棧模式解決了這個問題 – Srikan
查詢模塊是否被加載是個壞主意,因爲ipv6可以直接編譯進內核,而不是模塊 – youdontneedtothankme