使用CocoaAsyncSocket適配IPv6

2021-07-13 13:30:28 字數 1444 閱讀 3995

前提:之所以提到使用cocoaasyncsocke適配ipv6,是因為我的應用本身是社交應用,使用socket和伺服器連線。

蘋果審核反饋的資訊如下:

蘋果在ipv6的環境下審核,最終失敗。經過驗證,我們發現確實如此。

介紹一下,我們的應用網路模組的情況。所有的資料都是從socket收發,應用初次啟動的時候,本地是沒有業務伺服器的ip和埠的,所以應用先連到伺服器獲取這些業務伺服器的ip和埠,我們稱這個伺服器為服務列表伺服器。socket是直接使用的第三方元件cocoaasyncsocket。

連線服務列表伺服器也是通過socket連線,在連線的時候,先通過乙個在**裡面寫死的乙個ipv4的位址進行連線,如果連線不通,則通過解析乙個寫死的url獲取到位址之後再次進行連線,連線上之後從伺服器獲取真實的業務伺服器的ip和埠,並連線這些業務伺服器,注意這裡返回的業務伺服器ip也是ipv4格式的。

以上邏輯在ipv4的環境裡面是正常的,但是在ipv6的環境裡面就不行了,主要是ipv4格式的ip不能在ipv6裡面使用,所以雖然第一次通過預置的ip連線服務列表伺服器失敗,會解析url獲取到ipv6格式的ip,但是從服務列表伺服器拿到的ip仍然是ipv4格式的,無法使用。

所以一切的問題都指向乙個:ipv4格式的ip無法在ipv6的網路環境裡面使用。

解決方案:如果當前是處於ipv6的網路環境中,那就對該ipv4的ip進行轉換,拿到乙個ipv6格式的ip進行連線。

**邏輯:cocoaasyncsocket裡面有乙個類方法 

+ (nsmutablearray *)lookuphost:(nsstring *)host port:(uint16_t)port error:(nserror **)errptr
通過這個傳入乙個ipv4的ip或者傳入乙個url可以查到對應的ipv6的ip,前提是在ipv6的網路環境下,如果是在ipv4的網路環境下,只會拿到ipv4的ip,當判斷查到的array裡面有ipv6的ip的時候就直接用這個進行連線,否則用ipv4的ip進行連線

關鍵**:

//針對ipv6網路環境下適配,ipv4環境直接使用原來的位址

- (nsstring *)getproperipwithaddress:(nsstring *)ipaddr port:(uint32)port

nsstring *ipv6addr = @"";

for (nsdata *addrdata in addressearray)

}if (ipv6addr.length == 0)

return ipv6addr;

}

每次連線socket的時候都將連線的ip和port傳進來,最後會輸出乙個合適的ip,用這個ip和port進行連線就好了。

2016.09.19補充:

使用GraphEdit使用

1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....

MySQL使用學習使用 mysql學習使用

1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...

學習使用CSDN markdown使用

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...