无法关闭套接字选项 IPV6_V6ONLY

发布于 2024-10-31 02:40:30 字数 492 浏览 2 评论 0原文

我正在尝试关闭套接字选项 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)); 

I'm trying to turn off the socket option IPV6_V6ONLY.

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

Why does the above fail with errno 22 (EINVAL)?

This is on OS X. It also doesn't work when no is 1. Setting other socket options works, for example

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

辞旧 2024-11-07 02:40:30

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

It looks like *BSD derived OS doesn't allow set nor clear this option.
I see the same behavior on FreeBSD 8.X. The socket is 100% AF_INET6.

我们只是彼此的过ke 2024-11-07 02:40:30

对于 fd,您对 socket() 的调用是什么样的?如果第一个参数(协议族)不是 AF_INET6(或 PF_INET6),则此调用不适用。

What did your call to socket() look like for fd? If the first parameter, the protocol family, wasn't AF_INET6 (or PF_INET6), then this call isn't applicable.

埋情葬爱 2024-11-07 02:40:30

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

Make sure you are calling bind() after setsockopt() for this option.

苄①跕圉湢 2024-11-07 02:40:30

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

Another thing that can cause this to fail is doing it too late, it seems that on Linux at least it must be done before the socket is bound.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文