C IPv6绑定失败

C IPv6绑定失败,c,linux,sockets,ipv6,C,Linux,Sockets,Ipv6,我有一个服务器实现,其中我需要两个单独的套接字—一个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(t

我有一个服务器实现,其中我需要两个单独的套接字—一个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);
我正在使用evconnlister\u new\u 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失败,因为6 3ffe::a00:513-错误号99-无法分配请求的地址

我试图gdb进入,但每次我gdb进入,绑定都成功


我不知道为什么我会看到这个问题。有人能帮忙吗?

默认情况下,套接字绑定到TCP端口后,当套接字关闭时,端口保留一分钟-这称为TCP
TIME\u WAIT
状态
TIME\u WAIT
避免了一些可能导致数据损坏的竞争条件,但在服务器端忽略
TIME\u WAIT
通常是安全的

这是通过设置
SO\u REUSEADDR
socket选项来实现的:

int one = 1;
rc = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))

3ffe::/16
中的地址无效。请改用有效的IPv6地址。我的接口具有3ffe::10.1.14.14/120地址。创建套接字时,前缀掩码没有任何含义,对吗?你为什么说它是无效地址?因为它是无效的。那个上网锁几年前就被淘汰了。事实上,它正在使用中,这表明你的IPv6设置出了可怕的问题。先把它修好,有时候会有用的!我将尝试一种不同的寻址方案。但是任何关于它为什么无效的指针都会帮助我更好地理解。@jch它本身并不是无效的,但它在很多地方都被过滤掉了。请参阅RFC 3701。要清除,当拥有应用程序在其已建立连接的情况下主动关闭套接字时,套接字将进入
TIME\u WAIT
状态(如果远程对等方启动关闭,套接字将不会进入
TIME\u WAIT
)。然后,您可以在要绑定到先前绑定的ip+端口的下一个套接字上启用
SO\u REUSEADDR