c–IPv6绑定失败

c–IPv6绑定失败,第1张

概述我有一个服务器实现,我需要2个独立的套接字 - 1个IPv4套接字套接字监听特定的IPv4地址和服务器端口X,以及一个IPv6套接字监听特定的IPv6地址和相同的服务器端口X.IPv4和IPv6地址打开相同的界面. memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET;

我有一个服务器实现,我需要2个独立的套接字 – 1个IPv4套接字套接字监听特定的IPv4地址和服务器端口X,以及一个IPv6套接字监听特定的IPv6地址和相同的服务器端口X.IPv4和IPv6地址打开相同的界面.

    memset(&sin,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,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,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,绑定成功.

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

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

这可以通过设置SO_REUSEADDR套接字选项来完成:

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

以上是内存溢出为你收集整理的c – IPv6绑定失败全部内容,希望文章能够帮你解决c – IPv6绑定失败所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1048579.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存