如何从用户空间测试内核是否支持IPv6?

问题描述 投票:0回答:2

我正在寻找一种简单的方法来测试内核是否支持 Linux 上的 C/C++ 中的 IPv6。 检查 socket() 调用是否失败并且 errno 是否设置为 EINVAL 是否足够?

c linux sockets tcp userspace
2个回答
3
投票

确实,请阅读 ipv6(7):对 socket(7)-s 例程的调用,特别是 socket(2) 和其他例程,例如bind(2) 等...,可能会失败(无论如何你都应该总是处理此类失败)。

您还可以使用 proc(5) 例如阅读

/proc/net/if_inet6
/proc/net/sockstat6
(我相信如果不支持
ipv6
它将不存在)。


0
投票

是的,使用socket(7)是安全的,例如

#include <errno.h>
#include <sys/socket.h>
#include <unistd.h>

int is_ipv6_enabled(void) {
  int ret = 0;

#ifdef AF_INET6
  int fd = socket(AF_INET6, SOCK_STREAM, 0);
  if (fd == -1) {
    ret = errno != EAFNOSUPPORT;
  } else {
    ret = 1;
    close(fd);
  }
#endif /* AF_INET6 */

  return ret;
}
© www.soinside.com 2019 - 2024. All rights reserved.