IPV6双栈模式检查是否加载了ipv6内核模块

时间:2013-07-01 20:12:12

标签: c++ linux kernel ipv6

我正在尝试在ipv6双栈模式下运行我的服务器。在代码内部,如果加载了ipv6模块,我需要决定在双栈模式下运行,如果没有启用ipv6,我需要在正常模式下运行。有没有办法查询模块是否在内核中加载。

我正在尝试使用在中定义的query_module()api来获取模块信息。看起来query -module仅在内核2.6及更低版本中受支持。查询是否加载了特定模块的替代方法是什么。

有没有其他方法可以实现这一目标?

谢谢

1 个答案:

答案 0 :(得分:-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;
}