IPv6绑定失败

shr*_*jal 6 c sockets linux ipv6

我有一个服务器实现,我需要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);
Run Code Online (Sandbox Code Playgroud)

我正在使用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))
Run Code Online (Sandbox Code Playgroud)

当我将fd绑定到特定的ipv6地址时,我会间歇地看到绑定失败.

绑定v6失败sin6 3ffe :: a00:513 - 错误99 - 无法分配请求的地址

我尝试了gdb,但每次我gdb,绑定成功.

我不确定为什么我会看到这个问题.有人可以帮忙吗?

jch*_*jch 1

默认情况下,套接字绑定到 TCP 端口后,当套接字关闭时,该端口将保留一分钟 \xe2\x80\x94 这称为 TCP 状态TIME_WAIT。 避免一些可能导致数据损坏的竞争条件,但在服务器端TIME_WAIT通常可以安全地忽略。TIME_WAIT

\n\n

这是通过设置SO_REUSEADDR套接字选项来完成的:

\n\n
int one = 1;\nrc = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))\n
Run Code Online (Sandbox Code Playgroud)\n