Unity 支持 IPV6 (IOS)

来源:互联网 发布:手机计算器软件 编辑:程序博客网 时间:2024/04/30 08:11

Apple 强制规定,6月份之后上架的APP  需要支持IPv6 。

Apple在开发者中心添加了完整的代码修改指导,以及 如何通过MAC 共享 IPV6 的Wifi ,如下网页

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html

翻到网页最下方的 To set up a local IPv6 Wi-Fi network using your Mac  就是MAC共享 IPV6 Wifi的方法(需要最新的OSX系统和IOS9.3 以上的系统支持)


Unity 也及时做出了响应,在最新的 4.7.2 以及同时期的 Unity5.3.x 版本中对 IPV6进行了支持。

http://blogs.unity3d.com/2016/05/10/unity-and-ipv6-support/

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

这两天我也在弄这事,还比较纠结。

一开始我以为只要更新Unity,然后在MAC上共享出来 NAT64 网络就可以了,后面发现不是这么回事。

Unity的这次更新只是新增了对IPV6的支持,这是什么意思?

就是说Unity只是改了API,能支持IPV6的网络了,但是你们之前指定了使用IPV4,那Unity也不会自动帮你们改成IPV6.


我们之前的项目,如果是指定了IPV4的,还是要手动添加对IPV6的兼容

也就是说既要考虑到 IPV4的网络支持,又要考虑到 IPV6 的网络支持。


首先,Unity官方强烈要求,一定要使用域名!!


按照Unity官方博客,上层API,如WWW,我们在使用的时候也没有做指定IPV4的操作,所以不用修改。

然后底层API,比如Socket,我们之前一般是这样写

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

这就是IPV4 !!


IPV6是这样写的

socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);


所以,该怎么办呢?

直接从IPV4改成IPV6吗?那IPV4的网络下就悲剧了。

所以我们要判断下当前是IPV4还是IPV6的网络环境。


这里要说到Unity 新增的对IPV6的支持。

其中之一就是  Dns.GetHostAddress 。

如下代码

IPAddress[] address=Dns.GetHostAddresses("test.thisisgame.com.cn"); 

如果当前是 IPV6 的网络环境,这个函数会返回一个 IPV6 地址。

如果当前是 IPV4 的网络环境,这个函数会返回一个 IPV4 地址。


大家都知道 IPV6和IPV4是有很大不同的,IPV4是这样的 127.0.0.1 ,但是IPV6是这样 64:ff9b::7237:5342

所以我们可以判断下, GetHostAddress 返回的IP里面,如果带有 : 冒号,那么就是IPV6了,然后指定 Socket使用 IPV6就可以了。


那么其实,还有简单的方法,判断 IPAddress 的 AddressFamily。

address[0].AddressFamily==AddressFamily.InterNetworkV6

这样就可以判断是IPV6 还是 IPV4了。


下面是完整代码:

using UnityEngine;using System.Collections;using System.Net;using System;using System.Net.Sockets;public class NewBehaviourScript : MonoBehaviour {// Use this for initializationvoid Start () {}    void OnGUI()    {        if(GUI.Button(new Rect(100,100,300,300),"Connect"))        {            Debug.Log("Connect 0");            IPAddress[] address=Dns.GetHostAddresses("test.thisisgame.com.cn");             //IPAddress[] address = Dns.GetHostAddresses("115.35.88.130");            foreach (var info in address)            {                Debug.Log(info);            }            Socket socket = null;            if (address[0].AddressFamily==AddressFamily.InterNetworkV6)            {                Debug.Log("Connect InterNetworkV6");                socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);            }            else            {                Debug.Log("Connect InterNetwork");                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            }            socket.Connect(address, 56003);            Debug.Log("Connect Success");        }    }// Update is called once per framevoid Update () {}}

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

服务端不用修改任何东西。


至此。


其它一些问题。


1、如何判断当前是IPV6网络?

当你的DNS是像下图中这样的时候,就是IPV6网络了,再用 Safari 打开 Apple 官网,如果能打开,就没问题。


2、已经是IPV6网络了,但是却打不开 Apple 官网?

首先看看MAC是否 联网

然后看看MAC是否开了VPN

关闭无线,打开重新连接,重复。


3、已经是IPV6网络,但是出现 Access Denied 错误


这个错误是由于 Socket 中仍然是指定IPV4模式引起的。应该判断当前是IPV4还是IPV6,如果是IPV6就指定Socket为IPV6模式,代码见正文附的代码。

转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

3、出现 An address incompatible with the requested protocal was used,是因为没有升级Unity到最新版本!


附: MAC 共享 IPV6 WIFI方法(需要最新OSX 系统以及 IOS9.3.x 系统支持)

1、首先清除WIFI 连接记录,然后关闭WIFI,让MAC接入有线网。

2、按住 Option /Alt 键,点击 共享 ,打开网络共享界面


3、进入到 共享界面,选择 互联网共享,然后选择 共享以下来源的连接为 以太网 , 用以下端口共享给电脑选择 WIFI,就是把网线的网 通过WIFI 共享出去。


4、勾选互联网共享,开始共享网络转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn


查看WIFI状态,一个箭头,代表正在共享网络



现在用手机连接看看吧!


4 0