2011-06-14 130 views
3

我正在實現雙協議棧模式來支持IPV4和IPV6。 如果我正在創建一個IPV6套接字並監聽它,它是否會接受來自IPv4套接字的連接?創建IPV6套接字

回答

3

是的,除非操作系統被另外配置,例如,您可以在Linux中使用net.ipv6.bindv6only=1,或者設置IPV6_V6ONLY套接字選項。

+0

我在.Net注意到你必須明確地將'SocketOptionName.IPv6Only'設置爲'false',否則它不會接受IPv6套接字上的IPv4連接。例如:'listener_socket.SetSocketOption(SocketOptionLevel.IPv6,SocketOptionName.IPv6Only,false);' – 2011-06-14 19:12:34

2

僅當系統具有dual-stack實施。大多數現代系統都可以,但舊版本的Windows和OpenBSD不支持。你不應該依賴這個。獲取IPV6_V6ONLY套接字選項的值,如果它爲零,則需要爲IPv4打開第二個套接字。

當使用雙棧插座時,IPv4地址表示爲::ffff:[IPv4 address];例如::ffff:127.0.0.1(這對應於::ffff:7f00:1;爲便於閱讀,它通常僅以點十進制表示法打印)。

+0

@spencercw ...但在創建並接受ipv6套接字連接時,我們必須傳遞sockaddr_in6結構及其大小。所以,它會不會有所作爲。以及如何設置IPV6_V6ONLY的值。你能解釋一下如何在代碼中實現它嗎?我需要通過setsocketoption傳遞這個嗎? – 2011-06-14 20:55:24

+0

您可能不想更改僅IPv6選項。如果可用,請使用雙棧功能,只有在不支持IPv4時纔打開第二個套接字。您需要使用[getsockopt()](http://linux.die.net/man/3/getsockopt)來獲取選項的值。 – spencercw 2011-06-14 21:51:57

1

Microsoft,默認甚至在雙棧模式是有IPV6_V6ONLY設置爲false - 但你可以通過調用setsockopt(2)調用啓用它。 FWIW,Windows的「舊版本」(單一堆棧)包括仍然廣泛使用的Windows XP(比Vista更早)。

所以,如果你在Windows上,你應該嘗試和禁用IPV6_V6ONLY,看看它是否成功。我不知道這是否是其他單堆棧實現的好答案。