我正在尝试以 ipv6 双栈模式运行我的服务器。在代码中,如果加载了 ipv6 模块,我需要决定以双栈模式运行,如果未启用 ipv6,我需要决定以正常模式运行。有没有办法查询模块是否加载到内核中。
我正在尝试使用在 . 看起来 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;
}