【发布时间】:2015-02-02 10:04:03
【问题描述】:
我有一个服务器实现,我需要 2 个单独的套接字 - 1 个 IPv4 套接字套接字侦听特定的 IPv4 地址和服务器端口 X,以及一个 IPv6 套接字侦听特定的 IPv6 地址和相同的服务器端口 X。IPv4 和 IPv6地址在同一个接口上。
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(v4addr);
sin.sin_port = htons(tcp_port);
我正在使用 evconnlistener_new_bind 创建 ipv4 套接字并绑定到它。 对于 IPv6 监听器,代码如下。
memset(&sin6, 0, sizeof(sin6));
sin6.sin6_family = AF_INET6;
memcpy(sin6.sin6_addr.s6_addr, v6addr_bytes, IPV6_ADDR_LEN);
sin6.sin6_port = htons(tcp_port);
fd = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
evutil_make_socket_nonblocking(fd)
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void*)&on, sizeof(on))
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&on, sizeof(on))
evutil_make_listen_socket_reuseable(fd) /* Libevent call to set SO_REUSEADDR */
evutil_make_socket_nonblocking(fd) /* Libevent call to set fd non-blocking */
bind(fd, (const struct sockaddr *)&sin6, sizeof(sin6))
当我将我的 fd 绑定到特定的 ipv6 地址时,我间歇性地看到绑定失败。
bind v6 failed sin6 3ffe::a00:513 - errno 99 - 无法分配请求的地址
我尝试 gdb in,但每次我 gdb in,绑定都会成功。
我不确定为什么我会看到这个问题。有人可以帮忙吗?
【问题讨论】:
-
3ffe::/16中的地址无效。请改用有效的 IPv6 地址。 -
我的界面有一个3ffe::10.1.14.14/120地址。在创建套接字时,前缀掩码没有任何含义,对吧?为什么说它是无效地址?
-
因为它无效。那个网络块几年前就已经过时了。而且它在使用中的事实表明您的 IPv6 设置存在严重错误。先解决这个问题。
-
它有时会起作用!我将尝试不同的寻址方案。但是任何关于它为什么无效的指针都会帮助我更好地理解。
-
@jch 这不是无效的本身,但它在很多地方被过滤。请参阅 RFC 3701。