我正在實現雙協議棧模式來支持IPV4和IPV6。 如果我正在創建一個IPV6套接字並監聽它,它是否會接受來自IPv4套接字的連接?創建IPV6套接字
回答
是的,除非操作系統被另外配置,例如,您可以在Linux中使用net.ipv6.bindv6only=1
,或者設置IPV6_V6ONLY
套接字選項。
僅當系統具有dual-stack實施。大多數現代系統都可以,但舊版本的Windows和OpenBSD不支持。你不應該依賴這個。獲取IPV6_V6ONLY套接字選項的值,如果它爲零,則需要爲IPv4打開第二個套接字。
當使用雙棧插座時,IPv4地址表示爲::ffff:[IPv4 address]
;例如::ffff:127.0.0.1
(這對應於::ffff:7f00:1
;爲便於閱讀,它通常僅以點十進制表示法打印)。
@spencercw ...但在創建並接受ipv6套接字連接時,我們必須傳遞sockaddr_in6結構及其大小。所以,它會不會有所作爲。以及如何設置IPV6_V6ONLY的值。你能解釋一下如何在代碼中實現它嗎?我需要通過setsocketoption傳遞這個嗎? – 2011-06-14 20:55:24
您可能不想更改僅IPv6選項。如果可用,請使用雙棧功能,只有在不支持IPv4時纔打開第二個套接字。您需要使用[getsockopt()](http://linux.die.net/man/3/getsockopt)來獲取選項的值。 – spencercw 2011-06-14 21:51:57
據Microsoft,默認甚至在雙棧模式是有IPV6_V6ONLY設置爲false - 但你可以通過調用setsockopt(2)調用啓用它。 FWIW,Windows的「舊版本」(單一堆棧)包括仍然廣泛使用的Windows XP(比Vista更早)。
所以,如果你在Windows上,你應該嘗試和禁用IPV6_V6ONLY,看看它是否成功。我不知道這是否是其他單堆棧實現的好答案。
- 1. iOS套接字IPv6支持
- 2. Android上的IPv6套接字
- 3. 如何在Python中通過IPv6創建組播流套接字?
- 4. 創建與IPv4和IPv6兼容的套接字
- 5. postgresql無法創建ipv6套接字:權限被拒絕
- 6. 套接字創建
- 7. 創建套接字連接
- 8. 比較IPV4套接字(sockaddr_in)與IPV6套接字(sockaddr_in6)
- 9. 未創建Android套接字
- 10. 創建套接字C++
- 11. 綁定IPv4和IPv6套接字失敗
- 12. IPv6套接字程序問題
- 13. 與GEVENT WSGIServer使用IPv6套接字
- 14. 將套接字綁定到IPv6地址
- 15. java中的僅IPv6套接字
- 16. 在蜂窩網絡上的Android設備上創建IPv6套接字服務器
- 17. 創建IPv6標頭
- 18. 如何通過MSVC上的套接字()創建套接字?
- 19. Chrome套接字API:如何創建半開放TCP套接字
- 20. 無法使用IO創建套接字::套接字
- 21. Android 6.0不能創建套接字
- 22. Android NDK套接字創建空指針
- 23. Cordova:創建套接字服務器
- 24. 如何從套接字創建'ostream'?
- 25. 創建SSL套接字時發生NullPointerException
- 26. 在AsyncTask中創建套接字NetworkOnMainThreadException
- 27. 創建套接字函數返回-1
- 28. 無法創建套接字。 UnknownHostException
- 29. 突然無法創建套接字
- 30. Vapor - 創建網絡套接字
我在.Net注意到你必須明確地將'SocketOptionName.IPv6Only'設置爲'false',否則它不會接受IPv6套接字上的IPv4連接。例如:'listener_socket.SetSocketOption(SocketOptionLevel.IPv6,SocketOptionName.IPv6Only,false);' – 2011-06-14 19:12:34