recvfrom()在 IPv6 套接字上是否總是在from引數中回傳 IPv6 地址?我擔心的是,如果 IPv6 套接字通過 IPv4 映射的 IPv6 地址與 IPv4 目標通信,是否有可能recvfrom()直接回傳 IPv4 地址?
uj5u.com熱心網友回復:
一個AF_INET(IPv4)的插座只適用于IPv4地址。
一個AF_INET6(IPv6)的插座只適用于IPv6地址。
一個雙堆疊插座是AF_INET6與套接字IPV6_V6ONLY選項關閉,因此它可以與IPv4和IPv6同行攜手。由于它是 IPv6 套接字,因此 IPv4 地址將始終表示為 IPv4 映射的 IPv6 地址。這在檔案中明確說明:
具有雙堆疊套接字的 IP 地址
雙堆疊套接字始終需要 IPv6 地址。與 IPv4 地址互動的能力需要使用 IPv4 映射的 IPv6 地址格式。任何 IPv4 地址都必須以 IPv4 映射的 IPv6 地址格式表示,這使僅 IPv6 的應用程式能夠與 IPv4 節點通信。IPv4 映射的 IPv6 地址格式允許將 IPv4 節點的 IPv4 地址表示為 IPv6 地址。IPv4 地址被編碼為 IPv6 地址的低 32 位,高 96 位保存固定前綴 0:0:0:0:0:FFFF。IPv4 映射的 IPv6 地址格式在 RFC 4291 中指定。有關更多資訊,請參閱www.ietf.org/rfc/rfc4291.txt。Mstcpip.h 中的 IN6ADDR_SETV4MAPPED 宏可用于將 IPv4 地址轉換為所需的 IPv4 映射 IPv6 地址格式。
如果底層協議實際上是 IPv4,則將 IPv4 地址映射為 IPv4 映射的 IPv6 地址格式。即SOCKADDR結構中的family欄位表示AF_INET6,但IPv4映射的IPv6地址編碼在IPv6地址結構中。對于處于偵聽模式的雙堆疊套接字,這意味著任何接受的 IPv4 連接都將回傳一個 IPv4 映射的 IPv6 地址。對于連接到 IPv4 目標的雙堆疊套接字,傳遞給 connect 的 SOCKADDR 結構必須是 IPv4 映射的 IPv6 地址。應用程式必須注意適當地處理這些 IPv4 映射的 IPv6 地址,并且只能將它們與雙堆疊套接字一起使用。如果要將 IP 地址傳遞給常規 IPv4 套接字,則該地址必須是常規 IPv4 地址,而不是 IPv4 映射的 IPv6 地址。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409890.html
標籤:
