ipv6 bind()失败,出现WSAEADDRNOTAVAIL(10049)

时间:2019-12-13 17:36:32

标签: c++ bind ipv6 windows-socket-api

背景

我的客户端程序正在尝试连接到服务器程序中的侦听ipv6套接字。可以使用netstat -a查看正在监听的套接字。连接套接字通过调用win-socket-api GetBestInterfaceEx获得正确的接口。接下来,我调用ResolveIpNetEntry2,这意味着操作系统已发送Neighbor Solicitation并收到Neighbor Advertisement消息。 ip地址的State变为NlnsReachable(网络层邻居请求)这一事实证明,操作系统已在处理此协议消息交换。接下来,我呼叫CreateIpNetEntry2,它进入本地计算机上连接计算机的侦听端点。要使外部地址永久可访问,请致电GetIpNetEngry2。 ip地址的State现在为NlnsPermanent

我没有包含代码,因为这时代码很广泛,并且因为这里提到的所有windows-socket-api调用都可以很好地用于侦听套接字。

问题:

但是当我尝试bind()时,出现错误WSAEADDRNOTAVAIL (10049),即:

  

“所请求的地址在其上下文中无效。”

问题:

鉴于一系列的Windows-socket-api调用,操作系统为何无法识别IP地址?

类似问题:

bind() fails with windows socket error 10049:他的问题是他没有memset将其套接字结构设为0。

Binding an ipv6 slaac address to windows IP Stack error 10049:在这里,我正确地使用了CreateUnicastIpAddressEntrylisten()。对于这个问题,我使用的是背景部分中所述的一系列呼叫。

bind () to an IPv6 address in windows 7 is Failing with Error code :: WSAEADDRNOTAVAIL (10049):此Q试图绑定到本地链接地址而不设置sin6-scope-id。我正在使用忽略范围ID的全局单播。

Binding an ipv6 slaac address to windows IP Stack error 10049:显示了使ipv6全局单播侦听器套接字正常工作时的问题解决方案。

尝试1:

由于侦听器套接字调用CreateUnicastIpAddressEntry并随后对bind()listen()进行了调用,因此我对其进行了额外的调用,但这没有用,并且导致了相同的{ {1}}错误。

Attempt2:

作为测试,我用我的ISP委派给我的单个首选ipv6地址替换了生成的RFC7217兼容的ipv6全球单播地址。 WSAEADDRNOTAVAIL成功。也许我错过了一些其他的套接字API调用,这些调用会使bind()成功。

尝试3:

根据建议,运行了IPv6-Enabled Client Code代码和IPv6-Enabled Server Code。使用bind()系列和connect()协议对套接字accept()AF_INET6进行调整就可以了。我看到在我的代码中失败的SOCKSTREAM在客户端代码中没有被调用,仅是bind()然后是socket()。我还需要重新考虑使用connect()调用,因为示例代码可以正常工作并且在客户端和windows-socket-apigetaddrinfo,{{1}上使用标准的getaddrinfo()调用},bind(),然后再连接到listen()。然后回答了我的问题:客户端select()之前没有accept()

结论:

低级bind()调用是源代码不透明的问题,否则将很容易调试并获得答案。

结论2:

我认为应该重新打开此帖子。我想让connect()发表他关于在服务器网络上运行服务器和客户端代码的建议,作为答案。正是这种建议和随后的示例代码运行使我的思想转到了我发现客户端__imp_bind()错误的地方。他的答案值得在这篇文章中。没有背景的清晰和尝试,我就不会获得正确的评论并得出答案。关闭发布还为时过早。

0 个答案:

没有答案