【问题标题】:IPV6 dual stack mode check is ipv6 kernel module is loadedIPV6 双栈模式检查是否加载了 ipv6 内核模块
【发布时间】:2013-06-29 01:37:41
【问题描述】:

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

我正在尝试使用 .看起来 query_module 仅在内核 2.6 及以下版本中受支持。查询特定模块是否已加载的替代方法是什么。

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

谢谢

【问题讨论】:

  • 你也可以尝试创建一个 IPv6 套接字,看看你是否得到一个。
  • 问题是,我需要使用同一个端口。双栈模式解决了这个问题
  • 查询一个模块是否被加载是个坏主意,因为 ipv6 可以直接编译到内核中,而不是作为一个模块
  • 您不需要也不应该费心检查内核模块以查看是否可以使用 IPv6。例如,一个系统可能加载了 IPv6 模块,但没有超出本地链接(实际上没有)或根本没有 IPv6 连接。

标签: c++ linux kernel ipv6


【解决方案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;
}

【讨论】:

  • 请解释问题和答案有什么问题?如果您有更好的解决方案,请解释。我不希望我要求所有以前的用户转储只知道旧端口的旧产品。
猜你喜欢
  • 2017-07-13
  • 2012-12-30
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多