无法关闭套接字选项IPV6_V6ONLY

jls*_*ker 5 c sockets macos

我正在尝试关闭套接字选项IPV6_V6ONLY.

int no = 0;     
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&no, sizeof(no)); 
Run Code Online (Sandbox Code Playgroud)

为什么上面的错误与errno 22(EINVAL)失败?

这是在OS X上.它在no1 时也不起作用.例如,设置其他套接字选项有效

int yes = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes)); 
Run Code Online (Sandbox Code Playgroud)

Joe*_*and 6

确保您bind() 随后 setsockopt()致电选择此选项。


Bil*_*osa 5

你的电话socket()看起来像fd什么?如果第一个参数协议族不是AF_INET6(或PF_INET6),则此调用不适用。


小智 5

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

  • 自5.x以来FreeBSD已禁用IPv4地址上的IPv4映射,因此除非通过在rc.conf中设置所需的配置标志来重新打开该功能,否则您将无法使用它. (4认同)