unity游戏应用提交app stroe需要通过ipv6测试,但是unity本身我没找到可用的接口,所以使用ios插件来处理。

插件的IOSNativeNet.h和IOSNativeNet.m代码:

IOSNativeNet.h

@interface BundleId : NSObject

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

@end

IOSNativeNet.m

#import "IOSNativeNet.h"
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h> #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";
const char *cause = NULL;
struct addrinfo* res0;
struct addrinfo hints;
struct addrinfo* res;
int n, s; memset(&hints, , sizeof(hints)); hints.ai_flags = AI_DEFAULT;
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM; if((n=getaddrinfo(mHost, "http", &hints, &res0))!=)
{
printf("getaddrinfo error: %s\n",gai_strerror(n));
return NULL;
} struct sockaddr_in6* addr6;
struct sockaddr_in* addr;
NSString * NewStr = NULL;
char ipbuf[];
s = -;
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);
}

在unity中C#调用插件的代码:

using System;
using System.Net.Sockets; namespace SDK.Lib
{
public class IOSNativeNetImport
{
[System.Runtime.InteropServices.DllImport("__Internal")]
private static extern string getIPv6(string mHost, string mPort);
//"192.168.1.1&&ipv4" public static string GetIPv6(string mHost, string mPort)
{
#if UNITY_IPHONE && !UNITY_EDITOR
string mIPv6 = getIPv6(mHost, mPort);
return mIPv6;
#else
return mHost + "&&ipv4";
#endif
} static public 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))
{
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log(string.Format("IOSNativeNetImport::getIPType, mIPv6 not empty, mIPv6 = {0}", mIPv6), SDK.Lib.LogTypeId.eLogNetwork);
} string[] m_StrTemp = System.Text.RegularExpressions.Regex.Split(mIPv6, "&&");
if (m_StrTemp != null && m_StrTemp.Length >= )
{
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log(string.Format("IOSNativeNetImport::getIPType, m_StrTemp not empty, m_StrTemp[1] = {0}", m_StrTemp[]), SDK.Lib.LogTypeId.eLogNetwork);
} string IPType = m_StrTemp[];
if (IPType == "ipv6")
{
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log(string.Format("IOSNativeNetImport::getIPType, IPType is ipv6, m_StrTemp[0] = {0}", m_StrTemp[]), SDK.Lib.LogTypeId.eLogNetwork);
} newServerIp = m_StrTemp[];
mIPType = AddressFamily.InterNetworkV6;
}
else
{
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log(string.Format("IOSNativeNetImport::getIPType, IPType is not ipv6, m_StrTemp[0] = {0}", m_StrTemp[]), SDK.Lib.LogTypeId.eLogNetwork);
}
}
}
else
{
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log("IOSNativeNetImport::getIPType, m_StrTemp empty", SDK.Lib.LogTypeId.eLogNetwork);
}
}
}
else
{
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log("IOSNativeNetImport::getIPType, mIPv6 empty, mIPv6 = {0}", SDK.Lib.LogTypeId.eLogNetwork);
}
}
}
catch (Exception e)
{
//ClientLog.Instance.Log("GetIPv6 error: " + e);
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log(string.Format("IOSNativeNetImport::getIPType, error, exception = {0}", e), SDK.Lib.LogTypeId.eLogNetwork);
}
}
} static public void SocketClient(String serverIp, String serverPorts)
{
String newServerIp = "";
AddressFamily newAddressFamily = AddressFamily.InterNetwork;
getIPType(serverIp, serverPorts, out newServerIp, out newAddressFamily);
if (!string.IsNullOrEmpty(newServerIp))
{
serverIp = newServerIp;
} Socket socketClient = new Socket(newAddressFamily, SocketType.Stream, ProtocolType.Tcp);
//ClientLog.Instance.Log("Socket AddressFamily: " + newAddressFamily.ToString() + "ServerIp:" + serverIp);
}
}
}

最后是通过ip和port连接服务器是调用的方法:

public void Connect(string ip, int port)
{
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log(string.Format("SocketChannel::Connect, start, ip = {0} port = {1}", ip, port), SDK.Lib.LogTypeId.eLogNetwork);
} if (!_IsConnected()) {
string newServerIp = "";
AddressFamily newAddressFamily = AddressFamily.InterNetwork; //var address = Dns.GetHostAddresses(ip)[0];
SDK.Lib.IOSNativeNetImport.getIPType(ip, port.ToString(), out newServerIp, out newAddressFamily); if (SDK.Lib.MacroDef.ENABLE_LOG)
{
//SDK.Lib.Ctx.mInstance.mLogSys.log(string.Format("SocketChannel::Connect, address = {0} AddressFamily = {1}", address, address.AddressFamily), SDK.Lib.LogTypeId.eLogNetwork);
SDK.Lib.Ctx.mInstance.mLogSys.log(string.Format("SocketChannel::Connect, curIp = {0} newIp = {1} AddressFamily = {2}", ip, newServerIp, newAddressFamily), SDK.Lib.LogTypeId.eLogNetwork);
} ip = newServerIp; //this.socket = new Socket(address.AddressFamily, ProtocolType.Tcp == this.type ? SocketType.Stream : SocketType.Dgram, this.type);
//this.socket.BeginConnect(new IPEndPoint(address, port), new AsyncCallback(_ConnectCallback), this.socket); this.socket = new Socket(newAddressFamily, ProtocolType.Tcp == this.type ? SocketType.Stream : SocketType.Dgram, this.type);
this.socket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port), new AsyncCallback(_ConnectCallback), this.socket); _NotifyChannelStateChange(ChannelState.CONNECTING);
} else {
if (SDK.Lib.MacroDef.ENABLE_LOG)
{
SDK.Lib.Ctx.mInstance.mLogSys.log("SocketChannel::Connect, Connected", SDK.Lib.LogTypeId.eLogNetwork);
} _NotifyChannelStateChange(ChannelState.CONNECTED);
}
}

ios插件如何使用可参照我的前一篇随笔:http://www.cnblogs.com/lan-yt/p/6934155.html

unity3d ipv6支持的更多相关文章

  1. OpenWrt镜像编译和ipv6支持

    离成功实现路由器刷OpenWrt.接入校园网差不多一年了.路由工作比较稳定,还是很满意的. 这次回来有个新发现:学校有原生ipv6支持,在win7和ubuntu下什么都不用设置,自动获取global ...

  2. Unity3d不支持vistual studio2012?用vs2012打开unity c#脚本进行编码的方法。

    unity3d是支持vs2010的,但是有很多开发者反应,unity3d中的C#脚本不能用vs2012打开.我想了一下,先进入存放C#脚本的目录,在设置里面C#文件的打开方式,选择用vs2012打开, ...

  3. Win2019 IPV6 支持存在问题

    1. 昨天晚上尝试 使用IPV6进行Oracle与SQLserver 的链接测试.从晚上六点到晚上八点测试环境一直不通. 后来换了服务器之后发现立即就可以了. 经过简单确认 怀疑Win server ...

  4. c/c++11封装UDP,支持ipv4和ipv6,支持接收和发送

    更新日志 11/06/2021 1.增加IPV6 2.ipv6通过windows10初步测试 3.ipv6包括: 接收和发送 5.增加错误代码接口 6.本机IPv6截图 7.编译通过截图 8.ipv6 ...

  5. centOS添加ipv6支持(仅限已分配ipv6地址和网关)

    https://blog.csdn.net/cnmilan/article/details/8493977 CentOS 环境下 IPv6设置方法: 1)/etc/sysconfig/network  ...

  6. 开启ipv6支持

    CentOS6 开启ipv6模块操作在/etc/sysconfig/modules  目录下创建一个脚本,比如叫做 ipv6.modules,脚本中内容如下:#!/bin/shif [ ! -c /p ...

  7. ubuntu16.04 开启ipv6支持

     1)vim /etc/default/grub将GRUB_CMDLINE_LINUX中下面的这一项删除:ipv6.disable=12)执行 grub-mkconfig -o /boot/grub/ ...

  8. iOS应用支持IPV6,就那点事儿

    原文连接   果然是苹果打个哈欠,iOS行业内就得起一次风暴呀.自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6 ...

  9. iOS应用支持IPV6

    一.IPV6-Only支持是啥? 首先IPV6,是对IPV4地址空间的扩充.目前当我们用iOS设备连接上Wifi.4G.3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IP ...

随机推荐

  1. 开源 免费 java CMS - FreeCMS1.9 移动APP管理 执行配置

    项目地址:http://www.freeteam.cn/ 移动APP管理 从FreeCMS 1.8開始支持 执行配置 管理会员能够在这里设置移动app的欢迎图片. 从左側管理菜单点击执行配置进入. 选 ...

  2. android 自己创建一个凝视模板

    android  自己创建一个凝视模板 作为一名程序猿 不仅要有一个写代码的能力,养成一个良好的编写习惯也是非常重要的. 今天给大家具体介绍一下怎样创建凝视模板,给每一个类和方法都自己手动去凝视信息也 ...

  3. A. Arrays(Codeforces Round #317 水题)

    A. Arrays time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  4. 腾讯云安全:移动 APP 安全行业报告

    移动 APP 已逐步渗透入我们的生活,据统计,2016年,APP 发行数量仅电商.金融.游戏这三大类共计高达2万左右,国内移动互联网活跃用户数已经突破10亿,移动互联网这样快速的推移,移动互联网的安全 ...

  5. Ubuntu下搜狗拼音突然无法输入中文的解决办法

    搜狗输入法前段时间还可以正常使用,突然今天无法输入中文了.这种情况在Ubuntu中非常常见,可能的原因有3个:1.可能依赖有问题.2.配置文件出错了.3运行出错,需要重新启动一下. 因为我的这个是突然 ...

  6. cglib动态代理举例

    jdk的动态代理是基于接口的代理,而cglib不要求实现接口,是一种基于继承的代理,使用字节码生成被代理类的子类 public class TestMethodInterceptor implemen ...

  7. 《TCP-IP详解卷2:实现》【PDF】下载

    <TCP-IP详解卷2:实现>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 内容简介 <TCP/IP详解·卷2 ...

  8. NYOJ-106 简单背包问题

    首先观察题目,n表示输入数据的个数,s表示物品个数,m表示背包容重量,v表示物品单位重量的价值,w表示单个物品的总重量,物品可以分割,并且每个物品只可以拿一次,要求输出在满足包容重量的前提下包内物品价 ...

  9. layui样式修改记录

    记录以免遗忘: .layui-elem-quote{ padding 15 改为 5 }

  10. SQL Server 修改AlwaysOn共享网络位置

    标签:MSSQL/故障转移 概述 很多人一开始搭建Alwayson的时候对于共享网络位置的选择不是很重视, 导致后面需要去修改这个路径.但是怎样修改这个路径呢?貌似没有给出具体的修改选项,但是还是有地 ...