2017-08-04 115 views
0

我有一個iOS應用程序,利用內置套接字控件的庫(換句話說,我不自己創建套接字,我只是通過套接字參數庫)。我有兩個API可以從庫中獲得,每個都包含一個IPv4或IPv6的可配置地址。然後,我可以配置一個切換,告訴圖書館是否應該使用IPv6或IPv4。iOS檢測IPv6支持

這裏是配置如何加載

// IPv6 Configuration 
char* ipv6_addr = . . .; // This is defined elsewhere 
config.server.s6.sin6_family = AF_INET6; 
config.server.s6.sin6_port = htons(1122); 
inet_pton(AF_INET6, ipv6_addr, &(config.server.s6.sin6_addr)); 

// IPv4 Configuration 
char* ipv4_addr = . . .; // This is defined elsewhere 
config.server.s4.sin_family = AF_INET; 
config.server.s4.sin_port = htons(1122); 
inet_pton(AF_INET, ipv4_addr, &(config.server.s4.sin_addr)); 

config.use_ipv6 = 1; // Set to 0 to use IPv4 

我目前可以成功地連接到IPv4或IPv6根據一個示例什麼設備和客戶機網絡(ISP等)的支持,但我必須手動配置use_ipv6標誌。

我需要做的是檢查客戶端的網絡(ISP等)是否支持IPv6。如果是這樣,請使用IPv6連接。但是,如果沒有,請使用IPv4連接。最好是這樣的:config.use_ipv6 = has_ipv6_support();其中函數has_ipv6_support()返回10

那麼,我該如何去檢查網絡是否支持IPv6?

一)我不能使用,因爲插座的圖書館內被處理的getaddrinfo常規方法,我不能使用主機名,由於我的基礎設施基地轉變IP的周圍有很多。我只有一個IPv4地址或IPv6地址供我使用。 b)這是用C編寫的,但我不介意Objective C中的解決方案。

c)簡單地測試一個IPv6連接是很困難的,因爲我使用UDP進行連接,並且不得不超時響應。這比我想參與的邏輯要多一點,因爲這需要每隔一段時間完成一次,我不想通過保持網絡適配器的活性來殺死電池。我寧願能夠在本地獲取這些信息。

+1

通常最好的答案是「只是嘗試使用IPv6,如果這不起作用就會快速回到IPv4」。這是一個選項嗎?還記得你的應用程序需要從NAT64網關,因此在某些情況下仍需要將IPv4地址解析爲NAT64 IPv6地址。 –

+0

@SanderSteffann由於應用程序使用UDP協議,因此很難在響應沒有超時的情況下測試連接。 –

回答

0

作爲UDP服務器,您的庫應該同時監聽IPv4和IPv6地址。因爲絕對不可能知道哪些IPv4和IPv6可用,而沒有定期嘗試連接到使用IPv4和IPv6的遠程主機。這是因爲網絡故障可能發生在網絡中,僅在IPv6或IPv4路徑的某處,可能發生在可能與您的應用程序交談的遠程端。所以,要麼改變你的圖書館(但似乎不可能),或定期更換電池!對不起:-(