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/
这两天我也在弄这事,还比较纠结。
一开始我以为只要更新Unity,然后在MAC上共享出来 NAT64 网络就可以了,后面发现不是这么回事。
Unity的这次更新只是新增了对IPV6的支持,这是什么意思?
就是说Unity只是改了API,能支持IPV6的网络了,但是你们之前指定了使用IPV4,那Unity也不会自动帮你们改成IPV6.
之前的项目,如果是指定了IPV4的,还是要手动添加对IPV6的兼容!
也就是说既要考虑到 IPV4的网络支持,又要考虑到 IPV6 的网络支持。
首先,Unity官方强烈要求,一定要使用域名!!
按照Unity官方博客,上层API,如WWW,我们在使用的时候也没有做指定IPV4的操作,所以不用修改。
然后底层API,比如Socket,我们之前一般是这样写
//使用Socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//使用tcpClient
client = new TcpClient(AddressFamily.InterNetwork);
这就是IPV4 !!
IPV6是这样写的
//使用Socket
socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
//使用tcpClient
client = new TcpClient(AddressFamily.InterNetworkV6);
所以,该怎么办呢?
直接从IPV4改成IPV6吗?那IPV4的网络下就悲剧了。
所以我们要判断下当前是IPV4还是IPV6的网络环境。
这里要说到Unity 新增的对IPV6的支持。
其中之一就是 Dns.GetHostAddress 。
如下代码
[csharp] view plain copy
1. 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。
[cpp] view plain copy
1. address[0].AddressFamily==AddressFamily.InterNetworkV6
这样就可以判断是IPV6 还是 IPV4了。
下面是完整代码:
[csharp] view plain copy
1. using UnityEngine;
2. using System.Collections;
3. using System.Net;
4. using System;
5. using System.Net.Sockets;
6.
7. public class NewBehaviourScript : MonoBehaviour {
8.
9. // Use this for initialization
10. void Start () {
11.
12. }
13.
14. void OnGUI()
15. {
16. if(GUI.Button(new Rect(100,100,300,300),"Connect"))
17. {
18. "Connect 0");
19.
20. "test.thisisgame.com.cn");
21.
22. //IPAddress[] address = Dns.GetHostAddresses("115.35.88.130");
23.
24. foreach (var info in address)
25. {
26. Debug.Log(info);
27. }
28.
29.
30. null;
31. if (address[0].AddressFamily==AddressFamily.InterNetworkV6)
32. {
33. "Connect InterNetworkV6");
34. new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
35. }
36. else
37. {
38. "Connect InterNetwork");
39. new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
40. }
41. socket.Connect(address, 56003);
42.
43. "Connect Success");
44. }
45. }
46.
47.
48. // Update is called once per frame
49. void Update () {
50.
51. }
52. }
转自 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 共享出去。
转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn
查看WIFI状态,一个箭头,代表正在共享网络
现在用手机连接看看吧!