我有一个服务器实现,我需要2个独立的套接字 - 一个侦听特定IPv4地址和服务器端口X的IPv4套接字套接字,以及一个侦听特定IPv6地址和同一个服务器端口X的IPv6套接字。 IPv4和IPv6地址位于相同的接口上。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地址,我看到一个绑定失败间歇。
绑定V6失败sin6 3FFE :: A00:513 - 错误号99 - 无法分配请求的地址
我试图在gdb的,但我每次在gdb的时候,绑定成功。
我不知道为什么我看到这个问题。有人可以帮忙吗?
Addreses在'3FFE ::/16'无效。改为使用有效的IPv6地址。 – 2014-12-04 19:01:51
我的界面有一个3ffe :: 10.1.14.14/120地址。在创建套接字时,前缀掩码没有影响吗?你为什么说它是一个无效的地址? – shrejal 2014-12-05 20:49:30
因为它无效。那个网块在几年前就已经过时了。而且它完全被使用的事实表明,你的IPv6设置有些可怕的错误。首先解决它。 – 2014-12-05 20:52:04