【轉】iOS 解決ipv6問題


解決ipv6的方法有很多種,由於現在國內的網絡運營商還在使用ipv4的網絡環境,所以appstore應用不可能大范圍去修改自己的服務器,

而且國內的雲服務器幾乎沒有ipv6地址。

這里附上蘋果開發平台提供的解決方案地址:url

蘋果審核ipv6的標准是應用在ipv6的網絡環境下和最新的ios系統下,應用也能正常連接。 但是ipv6的客戶端是不能直接連接ipv4的服務端,

需要通過DNS64或者NAT64的轉換地址才能連接,下圖是連接的處理過程,

 

 

DNS64/NAT64是蘋果提供的轉換通道,不需要開發者去考慮這個問題,所以蘋果應用審核只要求開發者不要在底層寫死ipv4的通訊api,要兼容ipv6的

網絡環境即可。

以下是我通過getaddrinfo的api將ipv4轉換成ipv6的的過程,並且判斷當前環境網絡環境去開啟相應的ip網絡協議的實現:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>

#define CopyString(temp) (temp != NULL)? strdup(temp):NULL
const char* getIPV6(const char * mHost) {
    if(mHost == NULL)
        return NULL;
    struct addrinfo* res0;
    struct addrinfo hints;
    struct addrinfo* res;
    
    memset(&hints, 0, sizeof(hints));
    
    hints.ai_flags = AI_DEFAULT;
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    
    int n;
    if((n = getaddrinfo(mHost, "http", &hints, &res0)) != 0)
    {
        printf("getaddrinfo failed %d", n);
        return NULL;
    }
    
    struct sockaddr_in6* addr6;
    struct sockaddr_in * addr;
    const char* pszTemp;
    
    for(res = res0; res; res = res->ai_next)
    {
        char buf[32];
        if(res->ai_family == AF_INET6)
        {
            addr6 = (struct sockaddr_in6*)res->ai_addr;
            pszTemp = inet_ntop(AF_INET6, &addr6->sin6_addr, buf, sizeof(buf));
        }
        else
        {
            addr = (struct sockaddr_in*)res->ai_addr;
            pszTemp = inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf));
        }
        
        break;
    }
    
    freeaddrinfo(res0);
    printf("getaddrinfo ok %s\n", pszTemp);
    return CopyString(pszTemp);
}

#endif

在ios 9.2版本系統后,通過getaddrinfo轉換ipv4得到ipv6地址(這里我也被坑過了低版本的系統轉換不了ipv6,想測試只能升級系統),獲得ipv6地址后,可以判斷

地址字符串是否用“:” 來確定使用哪一種socket的通訊方式,判斷方法:std::strdchr(const char* value, const char* subStr),如果是NULL,則使用ipv4 socket連接

 if(strchr(addr, ':') != NULL)
        ivp6處理
 else
       ivp4處理

這樣一來就不會寫死通訊協議。

 

我這里還遇到一個坑,內網的訪問下是不可能連接到自己的服務器,后面測試一下公網阿里雲的服務器,能夠正常連接,這個可能是DNS64在搜索ipv6的過程中,並

沒有搜索內網的網絡,導致內網連接失敗(這里卡了半天, 切記)

 

轉載請注明出處,from 博客園HemJohn


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM