【问题标题】:IPv6 Bind failuresIPv6 绑定失败
【发布时间】: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。

标签: c linux sockets ipv6


【解决方案1】:

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

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

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

【讨论】:

  • 为了清除,当拥有的应用程序在建立连接时主动关闭套接字时,套接字进入TIME_WAIT状态(如果远程对等方发起关闭,套接字将不会进入TIME_WAIT )。然后,您可以在要绑定到先前绑定的 ip+port 的 NEXT 套接字上启用 SO_REUSEADDR
猜你喜欢
  • 2015-11-30
  • 2015-03-05
  • 2017-12-04
  • 2017-04-13
  • 1970-01-01
  • 2012-01-14
  • 2012-02-25
  • 2013-10-02
  • 1970-01-01
相关资源
最近更新 更多