Unity IPv6 Socket 支持

Unity IPv6 ?幾點注意事項:

1.unity版本: 4.7.2f1(此為我用的版本)

2.服務(wù)器IP地址 需要通過iOS原生代碼?getaddrinfo 做轉(zhuǎn)換

3.socket.LocalEndPoint ?socket.RemoteEndPoint (IPv6環(huán)境 ?訪問這兩個變量會報異常晒杈,需要做處理)

4.IOS9.2及以后的版本才支持IPv6(這個一定要注意)

Apple如何審核支持IPV6-Only?

首先第一點:這里說的支持IPV6-Only網(wǎng)絡(luò),其實就是說讓應(yīng)用在 IPv6 DNS64/NAT64 網(wǎng)絡(luò)環(huán)境下仍然能夠正常運行鲫剿。但是考慮到我們目前的實際網(wǎng)絡(luò)環(huán)境仍然是IPV4網(wǎng)絡(luò),所以應(yīng)用需要能夠同時保證IPV4和IPV6環(huán)境下的可用性。從這點來說,蘋果不會去掃描IPV4的專有API來拒絕審核通過斟赚,因為IPV4的API和IPV6的API調(diào)用都會同時存在于代碼中。

其次第二點:Apple官方聲明iOS9開始向IPV6支持過渡差油,在iOS9.2+支持IPV4地址合成IPV6地址拗军。其提供的Reachability庫在iOS8系統(tǒng)下,當(dāng)從IPV4切換到IPV6網(wǎng)絡(luò)蓄喇,或者從IPV6網(wǎng)絡(luò)切換到IPV4发侵,是無法監(jiān)控到網(wǎng)絡(luò)狀態(tài)的變化。也有一些開發(fā)者針對這些Bug詢問Apple的審核部門妆偏,給予的答復(fù)是只需要在蘋果最新的系統(tǒng)上保證IPV6的兼容性即可刃鳄。

最后第三點:只要應(yīng)用的主流程支持IPV6,通過蘋果審核即可钱骂。對于不支持IPV6的模塊叔锐,考慮到我們現(xiàn)實IPV6網(wǎng)絡(luò)的部署還需要一段時間挪鹏,短時間內(nèi)不會影響我們用戶的使用。但隨著4G網(wǎng)絡(luò)IPV6的部署愉烙,這部分模塊還是需要逐漸安排人力進行支持讨盒。

IOS IPv6 ? 官方說明文檔:https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

IOS代碼 ?.h 文件?(新建iOSipv6.h)

// ?iOSipv6.h

// ?Unity-iPhone

// ?Created by luzufei on 2017/3/2.

#ifndef iOSipv6_h

#define iOSipv6_h

@interface BundleId : NSObject

+(const char*)getIPv6:(const char*)mHost withPort:(const char* )mPort;

@end

#endif /* iOSipv6_h */

IOS代碼 .m文件?(新建iOSipv6.m)

//

// ?iOSipv6.m

// ?Unity-iPhone

// ?Created by luzufei on 2017/3/2.

#import "iOSipv6.h"

#include

#include

#include

#include

@implementation BundleId

#define MakeStringCopy( _x_ ) ( _x_ != NULL && [_x_ isKindOfClass:[NSString class]] ) ? strdup( [_x_ UTF8String] ) : NULL

const char* getIPv6(const char *mHost,const char *mPort)

{

if( nil == mHost )

return NULL;

const char *newChar = "No";

struct addrinfo* res0;

struct addrinfo hints;

struct addrinfo* res;

int n, s;

memset(&hints, 0, sizeof(hints));

hints.ai_flags = AI_DEFAULT;

hints.ai_family = PF_UNSPEC;

hints.ai_socktype = SOCK_STREAM;

if((n=getaddrinfo(mHost, "http", &hints, &res0))!=0)

{

printf("getaddrinfo error: %s\n",gai_strerror(n));

return NULL;

}

struct sockaddr_in6* addr6;

struct sockaddr_in* addr;

NSString * NewStr = NULL;

char ipbuf[32];

s = -1;

for(res = res0; res; res = res->ai_next)

{

if (res->ai_family == AF_INET6)

{

addr6 =( struct sockaddr_in6*)res->ai_addr;

newChar = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf));

NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar

encoding:NSASCIIStringEncoding];

NSString * TempB = [NSString stringWithUTF8String:"&&ipv6"];

NewStr = [TempA stringByAppendingString: TempB];

printf("%s\n", newChar);

}

else

{

addr =( struct sockaddr_in*)res->ai_addr;

newChar = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf));

NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar

encoding:NSASCIIStringEncoding];

NSString * TempB = [NSString stringWithUTF8String:"&&ipv4"];

NewStr = [TempA stringByAppendingString: TempB];

printf("%s\n", newChar);

}

break;

}

freeaddrinfo(res0);

printf("getaddrinfo OK");

NSString * mIPaddr = NewStr;

return MakeStringCopy(mIPaddr);

}

@end

Unity C#代碼

首先需要添加頭文件

#if UNITY_IPHONE

using System.Runtime.InteropServices;

#endif

定義接口

#if UNITY_IPHONE && !UNITY_EDITOR

[DllImport("__Internal")]

private static extern string getIPv6(string host, string port);

#endif

封裝接口

public static string GetIPv6(string host, string port)

{

#if UNITY_IPHONE && !UNITY_EDITOR

string ipv6 = getIPv6(host, port);

return ipv6;

#else

return host + "&&ipv4";

#endif

}

void getIPType(string serverIp, string serverPorts, out string newServerIp, out AddressFamily mIPType)

{

mIPType = AddressFamily.InterNetwork;

newServerIp = serverIp;

try

{

string mIpv6 = GetIPv6(serverIp, serverPorts);

if (!string.IsNullOrEmpty(mIpv6))

{

string[] m_StrTemp = System.Text.RegularExpressions.Regex.Split(mIpv6, "&&");

if (m_StrTemp != null && m_StrTemp.Length >= 2)

{

string IPType = m_StrTemp[1];

if (IPType == "ipv6")

{

newServerIp = m_StrTemp[0];

mIPType = AddressFamily.InterNetworkV6;

}

}

}

}

catch (Exception e)

{

DebugUtils.LogError("ipv6: " + e.Message);

}

}

Socket連接處添加的代碼(此為部分代碼片段,其余部分和ipv4相同)

#region ipv6

string newServerIp = "";

getIPType(server, port, out newServerIp, out mIpAddressFamily);

if (!string.IsNullOrEmpty(newServerIp))

{

server = newServerIp;

}

mSocket = new Socket(mIpAddressFamily, SocketType.Stream, ProtocolType.Tcp);

mIPs = Dns.GetHostAddresses(server);

mPort = int.Parse(port);

#endregion

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末步责,一起剝皮案震驚了整個濱河市返顺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勺择,老刑警劉巖创南,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伦忠,死亡現(xiàn)場離奇詭異省核,居然都是意外死亡,警方通過查閱死者的電腦和手機昆码,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門气忠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赋咽,你說我怎么就攤上這事旧噪。” “怎么了脓匿?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵淘钟,是天一觀的道長。 經(jīng)常有香客問我陪毡,道長米母,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任毡琉,我火速辦了婚禮铁瞒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桅滋。我一直安慰自己慧耍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布丐谋。 她就那樣靜靜地躺著芍碧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪号俐。 梳的紋絲不亂的頭發(fā)上泌豆,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音萧落,去河邊找鬼践美。 笑死洗贰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陨倡。 我是一名探鬼主播敛滋,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兴革!你這毒婦竟也來了绎晃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤杂曲,失蹤者是張志新(化名)和其女友劉穎庶艾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擎勘,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咱揍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了棚饵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煤裙。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖噪漾,靈堂內(nèi)的尸體忽然破棺而出硼砰,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站荆烈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏豹障。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一耘斩、第九天 我趴在偏房一處隱蔽的房頂上張望沼填。 院中可真熱鬧,春花似錦括授、人聲如沸坞笙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薛夜。三九已至,卻和暖如春版述,著一層夾襖步出監(jiān)牢的瞬間梯澜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工渴析, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晚伙,地道東北人吮龄。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像咆疗,于是被迫代替她去往敵國和親漓帚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容