sockaddr_in6未声明?

6

我试着将一个ipv4服务器/客户端移植到ipv6,但编译器报错说SOCKADDR_IN6不在范围内声明。已经声明了SOCKADDR_IN,但没有SOCKADDR_IN6。已经包含了<Winsock2.h>头文件。

有人知道为什么它会被未声明吗?


不知道你使用哪种操作系统头文件的情况下是无法猜测的。 - Hans Passant
3个回答

13

微软的 sockaddr_in6 文档 表明它是在 ws2tcpip.h 头文件中定义的,很可能需要包含该头文件。

在 Linux 上,您需要不同的头文件,即 sys/socket.hnetinet/in.h


抱歉,我正在使用Windows。当我说“已包括”时,我是指已经包括了Winsock2.h。我在它周围放置了“<”和“>”标签,所以出于某种原因它可能已被编辑掉了。 - Brad
@Brad:啊,我应该注意到了winsock标签... 我已经为Windows编辑了我的答案,并修复了你问题中的<winsock2.h>格式。 - sth
谢谢,那似乎解决了问题,但现在我仍然收到“getaddrinfo()未声明”的错误。 - Brad

1

我目前在ws2ipdef.h头文件(Visual Studio 2008)中找到了SOCKADDR_IN6的定义。然而,如下评论所述,MS Docs指出这个头文件不应该直接使用(应该使用Ws2tcpip.h代替)。


MS docs 明确指出应使用 ws2tcpip.h,而且“不应直接使用 Ws2def.h 和 Ws2ipdef.h 头文件。” - Jason C
我并没有说应该(直接)使用ws2ipdef.h,我只是指出了我在哪里找到了SOCKADDR_IN6的定义。 - Alexandre

0

来自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到哪个版本开始,您可能需要检查一下是否是这个问题。


1
我有最新版本的MinGW,应该包含最新版本的Winsock。我还尝试将sockaddr_in6作为小写使用,但它也没有被声明。我应该去哪里下载最新版本? - Brad
我想你正在寻找这个链接:http://msdn.microsoft.com/en-us/windows/bb980924.aspx - Tomaka17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接