我正在尝试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));
答案 0 :(得分:5)
看起来* BSD派生的操作系统不允许设置也不清除此选项。 我在FreeBSD 8.X上看到了相同的行为。套接字是100%AF_INET6。
答案 1 :(得分:4)
socket()
对fd
的看法是什么样的?如果第一个参数(协议系列)不是AF_INET6
(或PF_INET6
),则此调用不适用。
答案 2 :(得分:3)
请确保在 bind()
之后为此选项致电setsockopt()
。
答案 3 :(得分:0)
另一件可能导致失败的事情是做得太晚了,似乎在Linux上至少必须在套接字绑定之前完成。