【问题标题】:Can't turn off socket option IPV6_V6ONLY无法关闭套接字选项 IPV6_V6ONLY
【发布时间】:2011-08-01 01:41:16
【问题描述】:

我正在尝试turn off the socket option IPV6_V6ONLY

int no = 0;     
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&no, sizeof(no)); 

为什么上述操作失败并显示 errno 22 (EINVAL)?

这是在 OS X 上。当no 为 1 时它也不起作用。例如,设置其他套接字选项有效

int yes = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes)); 

【问题讨论】:

    标签: c macos sockets


    【解决方案1】:

    您对socket() 的呼叫对fd 有何影响?如果第一个参数协议族不是AF_INET6(或PF_INET6),则此调用不适用。

    【讨论】:

      【解决方案2】:

      看起来 *BSD 派生的操作系统不允许设置或清除此选项。 我在 FreeBSD 8.X 上看到了相同的行为。套接字是 100% AF_INET6。

      【讨论】:

      • FreeBSD 自 5.x 以来已禁用映射到 IPv6 地址的 IPv4,因此除非您通过在 rc.conf 中设置所需的配置标志重新打开该功能,否则您将无法使用它。
      【解决方案3】:

      确保您在调用bind() 之后 setsockopt() 使用此选项。

      【讨论】:

        【解决方案4】:

        另一个可能导致失败的事情是太晚了,似乎在 Linux 上至少必须在绑定套接字之前完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-24
          • 1970-01-01
          • 1970-01-01
          • 2011-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多