我可以bind()到in6addr_any(即::)和sendto()localhost

时间:2011-06-01 21:30:22

标签: c networking ipv6

我正在尝试编写示例客户端和服务器

现在sever.c

  1. 创建v6 UDP套接字
  2. bind()到in6addr_any即::
  3. recvfrom()(在sendto成功后在客户端)
  4. client.c中的

    1. 创建一个v6 udp套接字
    2. sendto()::ffff:127.0.0.1
    3. 我的疑问是这个场景是正确的还是我错过了什么?

      因为客户端sendto()成功但recvfrom()在服务器端挂起

      任何帮助??

      问候

      Biswajeet

1 个答案:

答案 0 :(得分:3)

in6addr_any是:: 0。作为bind()的参数,这可以表示“任何IPv6地址”或“任何IPv6或IPv4地址”,具体取决于侦听(IPv6)套接字的IPV6_V6ONLY sockopt。此sockopt的默认值取决于您的平台和本地配置 - 为了获得最大的可移植性,您必须手动设置它以获得您喜欢的任何行为。

如果设置为0,则它​​应该接收发往127.0.0.1(或任何其他本地地址)的数据包,这时您将看到:: ffff:127.0.0.1形式的IPv6地址。如果它设置为1,那么您的侦听套接字将不会接收发送到IPv4地址的数据包(以映射形式或其他方式)。

如果你有一个IPv6发送套接字,发送到:: 1比:: ffff:127.0.0.1更有意义(如果我理解设置正确,那么后者应该工作假设监听套接字接受两个堆栈)。