• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            戰(zhàn)魂小筑

            討論群:309800774 知乎關(guān)注:http://zhihu.com/people/sunicdavy 開源項(xiàng)目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評(píng)論 :: 0 Trackbacks

            蘋果要求在2016年6月1日后新的app必須支持ipv6網(wǎng)絡(luò), 技術(shù)發(fā)展靠蘋果果然沒錯(cuò), 但開發(fā)者還是要開始忙起來了
            這里介紹下Unity3D的適配的一些經(jīng)驗(yàn)

            基本注意點(diǎn)

            • ios ipv6適配無需修改服務(wù)器, 也就是說, 如果你的服務(wù)器依然是ipv4的也是可以使用的
            • 蘋果的適配方案是將ipv4的地址轉(zhuǎn)換為ipv6, 到了路由層再轉(zhuǎn)回去繼續(xù)利用ipv4網(wǎng)絡(luò)傳輸

            測(cè)試網(wǎng)絡(luò)環(huán)境搭建

            轉(zhuǎn)載請(qǐng)注明:http://www.shnenglu.com/sunicdavy戰(zhàn)魂小筑

            網(wǎng)上有很多翻譯了蘋果官方的搭建ipv6測(cè)試網(wǎng)絡(luò)環(huán)境的文章, 例如:
            http://www.cocoachina.com/ios/20160525/16431.html
            注意以下幾點(diǎn)

            • 無需路由器支持ipv6, 但貓(modem)必須要支持ipv6. 因?yàn)楝F(xiàn)在大多數(shù)都是光貓
              以下截圖是光貓管理端
              3440e3f9-12de-435b-85ab-a7a3be8b384b[6]
              光貓里的ipv6支持默認(rèn)是關(guān)閉的, 所以需要手動(dòng)打開, 按默認(rèn)值配置即可

            • 請(qǐng)確認(rèn)mac os系統(tǒng)必須是osx 10.11以后的版本才可以打開NAT64

            • 正確連接mac的ios設(shè)備應(yīng)是如下截圖示意
              91f54476-4b5d-4585-a364-0da2139774c1[6]

            • 默認(rèn)連接上wifi時(shí)看連接信息時(shí), 一般只會(huì)有紅色DNS地址或者根本不顯示
            • 只有在第一次訪問網(wǎng)絡(luò), 例如打開瀏覽器進(jìn)入任意網(wǎng)站時(shí), 才會(huì)顯示上面的幾條信息
            • 如果只有DNS沒有IP地址和子網(wǎng)掩碼, 一般是光貓沒有打開ipv6的DHCP, 沒有分配IP
            • 還有一種測(cè)試ipv6 DHCP是否正常工作的方法: 關(guān)閉NAT64時(shí)可以上網(wǎng), 但打開NAT64無法上網(wǎng)

            轉(zhuǎn)載請(qǐng)注明:http://www.shnenglu.com/sunicdavy戰(zhàn)魂小筑

            Unity3D的Socket適配

            WWW類本身已經(jīng)支持了IPV6, 無需處理, 這里講解使用C#原生Socket的處理

            • 測(cè)試用的設(shè)備的iOS版本必須是9.3以上的
            • Socket構(gòu)造時(shí), AddressFamily 設(shè)置為InterNetworkV6時(shí)只支持ipv6網(wǎng)絡(luò), 傳入InterNetwork時(shí)只支持ipv4網(wǎng)絡(luò)
            • 4.7.2和5.4.3的當(dāng)前版本在mono層并未支持ipv6代碼適配的核心函數(shù)getaddrinfo, 因此需要通過oc層做轉(zhuǎn)換, 以下是代碼
              這段代碼將getaddrinfo的地址轉(zhuǎn)換成一個(gè)完整字符串, 格式是:
              ipv4|ipv4地址|ipv6|ipv6地址|

            P.S. copyStr這種用法參考了http://www.codeinsect.net/blog/2016/05/26/unity-ipv6-socket-%E6%94%AF%E6%8C%81%EF%BC%8C%E5%B7%B2%E6%B5%8B%E8%AF%95%E9%80%9A%E8%BF%87/
            會(huì)造成內(nèi)存泄露, 如果有更好的方法歡迎反饋

            轉(zhuǎn)載請(qǐng)注明:http://www.shnenglu.com/sunicdavy戰(zhàn)魂小筑

            iosaddrinfo.mm

               1:  #include <sys/socket.h>
               2:  #include <netdb.h>
               3:  #include <arpa/inet.h>
               4:  #include <err.h>
               5:  #define OUTSTR_SIZE 4096
               6:  extern "C"
               7:  {
               8:      const char* copyStr( const char* str )
               9:      {
              10:          char* s = (char*)malloc(strlen(str) + 1);
              11:          strcpy(s, str);
              12:          return s;
              13:      }
              14:      const char* IOSGetAddressInfo(const char *host )
              15:      {
              16:          if( NULL == host )
              17:              return copyStr("ERROR_HOSTNULL");
              18:          char outstr[OUTSTR_SIZE];
              19:          struct addrinfo hints, *res, *res0;
              20:          memset(&hints, 0, sizeof(hints));
              21:          hints.ai_family = PF_UNSPEC;
              22:          hints.ai_socktype = SOCK_STREAM;
              23:          hints.ai_flags = AI_DEFAULT;
              24:          printf("getaddrinfo: %s\n", host);
              25:          int error = getaddrinfo(host, "http", &hints, &res0);
              26:          if (error != 0 )
              27:          {
              28:              printf("getaddrinfo: %s\n", gai_strerror(error));
              29:              return copyStr("ERROR_GETADDR");
              30:          }
              31:          memset( outstr, 0, sizeof(char)*OUTSTR_SIZE );
              32:          struct sockaddr_in6* addr6;
              33:          struct sockaddr_in* addr;
              34:          const char* solvedaddr;
              35:          char ipbuf[32];
              36:          for (res = res0; res; res = res->ai_next)
              37:          {
              38:              if (res->ai_family == AF_INET6)
              39:              {
              40:                  addr6 =( struct sockaddr_in6*)res->ai_addr;
              41:                  solvedaddr = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf));
              42:                  strcat ( outstr, "ipv6|");
              43:                  strcat ( outstr, solvedaddr);
              44:              }
              45:              else
              46:              {
              47:                  addr =( struct sockaddr_in*)res->ai_addr;
              48:                  solvedaddr = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf));
              49:                  strcat ( outstr, "ipv4|");
              50:                  strcat ( outstr, solvedaddr);
              51:              }
              52:              strcat ( outstr, "|");
              53:          }
              54:          return copyStr(outstr);
              55:      }
              56:  }
            轉(zhuǎn)載請(qǐng)注明:http://www.shnenglu.com/sunicdavy戰(zhàn)魂小筑

            iosaddrinfo.h

               1:  #pragma once
               2:  extern "C"{
               3:      const char* IOSGetAddressInfo(const char *host );
               4:  }
            • C#層的處理假設(shè)多個(gè)地址中都是統(tǒng)一的地址類型,要么全是v4要么全是v6
              返回給定的host內(nèi)多個(gè)IP地址, 可以供處理復(fù)雜的北網(wǎng)通,南電信問題

               1:  using System;
               2:  using System.Net;
               3:  using System.Net.Sockets;
               4:  using System.Runtime.InteropServices;
               5:  using UnityEngine;
               6:  using System.Collections;
               7:  using System.Collections.Generic;
               8:  public class IOSIPV6
               9:  {
              10:      [DllImport("__Internal")]
              11:      private static extern string IOSGetAddressInfo(string host );  
              12:      public static IPAddress[] ResolveIOSAddress(string host, out AddressFamily af)
              13:      {
              14:          af = AddressFamily.InterNetwork;
              15:          var outstr = IOSGetAddressInfo(host);
              16:          Debug.Log("IOSGetAddressInfo: " + outstr);
              17:          if (outstr.StartsWith ("ERROR")) 
              18:          {
              19:              return null;
              20:          }
              21:          var addressliststr = outstr.Split('|');
              22:          var addrlist = new List<IPAddress>();
              23:          foreach (string s in addressliststr)
              24:          {
              25:              if (String.IsNullOrEmpty(s.Trim()))
              26:                  continue;
              27:              switch( s )
              28:              {
              29:                  case "ipv6":
              30:                      {                        
              31:                          af = AddressFamily.InterNetworkV6;
              32:                      }
              33:                      break;
              34:                  case "ipv4":
              35:                      {
              36:                          af = AddressFamily.InterNetwork;
              37:                      }
              38:                      break;
              39:                  default:
              40:                      {
              41:                          addrlist.Add(IPAddress.Parse(s));
              42:                      }
              43:                      break;
              44:              }
              45:          }
              46:          return addrlist.ToArray();
              47:      }
              48:  }
            轉(zhuǎn)載請(qǐng)注明:http://www.shnenglu.com/sunicdavy戰(zhàn)魂小筑

            參考鏈接

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

            某人的解決方案
            http://www.codeinsect.net/blog/2016/05/26/unity-ipv6-socket-%E6%94%AF%E6%8C%81%EF%BC%8C%E5%B7%B2%E6%B5%8B%E8%AF%95%E9%80%9A%E8%BF%87/
            注意, 此方案中的方法可用, 但是地址并不能解決南北互通的問題

            久久夜色精品国产噜噜麻豆| 性做久久久久久久久| 欧美久久久久久| 久久久久这里只有精品 | 久久青青国产| 久久久久18| 久久久久久青草大香综合精品| 国内精品久久久久久久久| 国产午夜精品久久久久九九电影| 精品精品国产自在久久高清| 日本精品久久久中文字幕| 伊人久久免费视频| 99久久精品九九亚洲精品| 国产精自产拍久久久久久蜜| 久久乐国产精品亚洲综合| 久久久久久国产精品美女 | 国产高潮国产高潮久久久91 | 99久久国产综合精品网成人影院 | 久久se这里只有精品| 久久久久亚洲精品天堂久久久久久| 久久精品免费大片国产大片| 久久青青国产| 欧美一区二区三区久久综| 久久精品人人做人人爽电影| 久久久久久噜噜精品免费直播| 国产精品乱码久久久久久软件| 久久人人爽人人爽人人片AV不| 97热久久免费频精品99| 久久精品国产一区二区| 老男人久久青草av高清| 国产精品久久久亚洲| 亚洲国产成人久久笫一页| 久久久无码一区二区三区| 国产精品美女久久久免费| 久久久精品国产免大香伊 | 女同久久| 精品久久久久久久无码| 亚洲国产成人精品女人久久久 | 久久精品国产久精国产思思| 国产综合精品久久亚洲| 久久天天躁狠狠躁夜夜96流白浆 |