2014-02-27 74 views
0

我正在開發雙棧客戶機 - 服務器通信。而且我珍玩: 我一定要開兩個插座 - 一個用於IPv4和一個IPv6,或有打開一個套接字對IPv6的選項,這將是能夠與IPv4和IPv6的連接工作? 例如,如果我開這樣的插座:具有一個插槽的雙堆棧

SOCKET sock = socket(AF_INET6, SOCK_STREAM, 0); 

,然後調用

int mode = 0; 
    setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&mode, sizeof(mode)); 

難道接受IPv4和IPv6連接?如果它能接受它,我是否應該修改後續調用,定義套接字家族,然後根據該家族進行操作? 是這樣的:在提前

if (addr->ss_family == AF_INET) 
    { 

    } 
    else if (addr->ss_family == AF_INET6) 
    { 

    } 

感謝。

+0

更快的谷歌IPV6_V6ONLY似乎將其設置爲只接受v6。 – dutt

+0

通過傳遞模式爲0,您關閉該選項 –

+0

可能重複的[套接字偵聽器的IPv6和IPv4](http://stackoverflow.com/questions/20657650/socket-listener-for-ipv6-and-ipv4) –

回答

3

如果關閉IPV6_V6ONLY,你會得到IPv6和同一插座上IPv4映射的IPv6連接。因此你只需要打開一個插座。

明確地將其設置爲您想要的值是一個非常好的主意,因爲缺省情況在不同操作系統之間以及Linux內核版本之間不同。 (在Linux中,它當前默認爲關閉,但以前默認爲開啓。)

請注意,IPv4映射的IPv6地址將以字符串格式顯示,並帶有前導::ffff:(例如, ::ffff:203.0.113.47。你的應用程序需要能夠處理這個問題。