2010-08-09 549 views
3

我想將ipv4服務器/客戶端移植到ipv6,但編譯器說SOCKADDR_IN6未在範圍內聲明。 SOCKADDR_IN已聲明,但不是SOCKADDR_IN6。包括<Winsock2.h>sockaddr_in6未聲明?

任何人有任何想法,爲什麼它會被宣佈?

+0

不知道你使用的是什麼樣的操作系統頭文件。 – 2010-08-09 20:23:42

回答

8

微軟的documentation for sockaddr_in6表示它在ws2tcpip.h標題中定義,可能你需要包含它。

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

+0

對不起,我正在使用Windows。當我說「包含」時,我的意思是說包含Winsock2.h。我把「<" and ">」標籤放在它的周圍,所以它一定是因爲某些原因被編輯出來的 – Brad 2010-08-09 20:37:08

+0

@Brad:啊,我應該注意到了'winsock'標籤......我編輯了我對Windows的答案,並且修正了' '在你的問題中。 – sth 2010-08-09 20:48:34

+0

感謝,似乎解決了這個問題,雖然現在我仍然getgetdrinfo()沒有聲明.. – Brad 2010-08-09 20:59:06

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 2010-08-09 20:38:25

+0

我想說,你正在尋找這個:http://msdn.microsoft.com/en-us/windows/bb980924.aspx – Tomaka17 2010-08-09 20:55:25

1

我目前找到SOCKADDR_IN6定義在ws2ipdef.h標題(Visual Studio 2008)中。但是,正如下面的評論中所述,MS Docs指出,不應該直接使用此標頭(使用Ws2tcpip.h代替)。

+0

[MS文檔](https://msdn.microsoft.com/en-us/library/windows/ desktop/ms740496(v = vs.85).aspx)明確聲明應該使用ws2tcpip.h,並且「Ws2def.h和Ws2ipdef.h頭文件不應該直接使用」。 – 2016-10-11 02:40:37

+0

我沒有說應該直接使用ws2ipdef.h,我只是指出了我找到SOCKADDR_IN6定義的位置。 – Alexandre 2016-10-11 18:18:06