【问题标题】:sockaddr_in6 not declared?sockaddr_in6 没有声明?
【发布时间】:2011-03-27 12:12:51
【问题描述】:

我正在尝试将 ipv4 服务器/客户端移植到 ipv6,但编译器说 SOCKADDR_IN6 未在范围内声明。 SOCKADDR_IN 已声明,但未声明 SOCKADDR_IN6。包括<Winsock2.h>

有人知道为什么不申报吗?

【问题讨论】:

  • 在不知道您使用哪种操作系统标头的情况下无法猜测。

标签: c++ winsock ipv6


【解决方案1】:

Microsoft 的 documentation for sockaddr_in6 说它是在 ws2tcpip.h 标头中定义的,可能您需要包含它。

在 Linux 上,您需要不同的包含,sys/socket.hnetinet/in.h

【讨论】:

  • 抱歉,我使用的是 Windows。当我说“包含”时,我的意思是说包含 Winsock2.h。我在它周围放了“”标签,所以它一定是因为某种原因被删掉了
  • @Brad:啊,我应该注意到winsock 标签...我编辑了我的Windows 答案,还修复了您问题中<winsock2.h> 的格式。
  • 感谢这似乎解决了问题,虽然现在我仍然得到 getaddrinfo() 没有声明..
【解决方案2】:

我目前在 ws2ipdef.h 标头 (Visual Studio 2008) 中找到了 SOCKADDR_IN6 定义。然而,正如在下面的评论中所说,MS Docs 指出永远不应直接使用此标头(改用Ws2tcpip.h)。

【讨论】:

  • MS docs 明确指出应该使用 ws2tcpip.h 并且“绝不应该直接使用 Ws2def.h 和 Ws2ipdef.h 头文件。”
  • 我没有说应该(直接)使用 ws2ipdef.h,我只是指出了我在哪里找到了 SOCKADDR_IN6 定义。
【解决方案3】:

来自msdn

struct in_addr6 {
    u_char    s6_addr[16];             /* IPv6 address */
};

struct sockaddr_in6 {
    short             sin6_family;     /* AF_INET6 */
    u_short           sin6_port;       /* Transport level port number */
    u_long            sin6_flowinfo;   /* IPv6 flow information */
    struct in_addr6   sin6_addr;       /* IPv6 address */
    u_long            sin6_scope_id;   /* set of interfaces for a scope */
   };  

从你的问题我看出:

SOCKADDR_IN6 != sockaddr_in6

小写与大写混淆?
你也可能没有最新版本的winsock,我不确定对IPV6的支持有多早,你可能想检查一下是否是你的问题。

【讨论】:

  • 我有最新版本的 MinGW,它应该有最新版本的 Winsock。我也尝试使用 sockaddr_in6 作为小写,但也没有声明。我该去哪里下载最新版本?
  • 我会说你正在寻找这个:msdn.microsoft.com/en-us/windows/bb980924.aspx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2016-06-26
  • 2015-10-19
  • 1970-01-01
相关资源
最近更新 更多