沒有産品在購物車中。
?
?文檔說明 ?
本文檔是對遊戲盾sdk中不常用到的一些函数进行功能说明。这些函数功能在特定的场景下可能对您的项目有帮助。在阅读本文档前请先阅读另一个普通功能的 sdk 说明,它里面把sdk 的原理和如何集成描述的较为清楚。我们也为高级功能做了示例项目,请查看“demo 高級功能”下的項目。
?解決端口沖突 ?
經過多年的觀察及統計,端口沖突問題只是在個別客戶端設備上發生且發生概率及低。但爲徹底解決這個問題,我們還是建議您采用我們提供的高級功函數能將這個問題徹底解決掉。
由于我们的 sdk 是根据您配置的“转发规则”在客户端设备上开相应的端口,这就有极低的概率在个别的客户端发生端口冲突。端口沖突有兩類情形:
??第一種情形:您配置的某個端口在個別客戶端上已被其它應用占用了,則該用戶不能正常使用您的應用;
??第二種情形:您有多個應用但使用同一個實例,而且用戶在同一個設備上有時又會同時打開您的多個應用;用戶打開的第一個應用時已把您實例的所有端口都占用了,第二個應用打開時就無法打開這些端口了。
這個問題在 PC 上没关系,第二个打开的应用业务是正常的,因为第二个应用会通过第一个应用连接到 sdk,但在移动端就会有问题,第二个应用在一开始时还是正常的,因为这时第二个应用会通过第一个应用连接到 sdk,在用户使用第二个应用时第一个应用会被切到后台,过段时间第一个应用可能会被系统休眠,这时第二个应用就无法连接了。
??解決這個問集成起來也是很簡單的,代碼過程如下?: ?
dunSetAutoChangePort(1);//设置成自动更换冲突端口,只需要调用一次
int ret = clinkStart(key);//启动盾,有些系统用 start 具体请看另一个文档,只需要调用一次
//在需要新建连接时调用下面这行代码来获取新端口
int new_tcpPort = dunGetCurrentTCPPort("127.0.10.21", 600);//获取新的tcp对应的端口
//接下来采用new_tcpPort来连接应用
//connect("127.0.10.21", new_tcpPort) 例如这行伪代码
再举个例子,例如转发规则里配置的是 127.0.10.21:600 转到 202.23.56.9:600,未集成盾前和集成盾后并解決端口沖突的对比伪代码?: ?
未集成盾前的连接 connect("202.23.56.9",600)
集成盾后的连接 connect("127.0.10.21", dunGetCurrentTCPPort("202.23.56.9",600))
?設置是否自動更換沖突的端口:??
本函數必須在调用盾 start 前调用才有效。 ? ?
函數原型:void dunSetAutoChangePort(int val) ? ?
參數:val:是否自動更換。 ?
???功能:当 val 设为 1,在盾启动时如果检测到某个端口已被占用或其它原因法无打开这个这端口时,就会自动生成一个随机可用的端口,并把这个随机生成的端口和原来的端口进行关联, 您的程序在新建连接时就可以通过 sdk 提供的dunGetCurrentTCPPort 或dunGetCurrentUDPPort 函数来获取新生成的端口,采用新的端口来进行连接,这样就解决了端口冲突问题。
下面是各系統下对应的 sdk 函数定义,具体调用示例可查看“demo 高级功能”里的项目?: ?
?Windows: ? ?
extern "C" CLINKAPI_API void dunSetAutoChangePort(int val); ? ?
?android: ? ?
類:com.dun.clinkapi.Api ? ?
public native void dunSetAutoChangePort(int val); ? ?
?IOS 静态库: ? ?
類:ClinkAPI ? ?
void dunSetAutoChangePort(int val); ? ?
?IOS 动态库: ? ?
extern "C" void dunSetAutoChangePort(int val); ? ?
?Unity ? ?
類:ClinkSDKForUnity ? ?
public static void dunSetAutoChangePort(int val) ? ?
?Uni-app ? ?
插件name:dunClinkApiForUni ? ?
插件函數:dunSetAutoChangePort(val) ?
??獲取當前tcp對應端口:
在新建 tcp 连接前您要调用这个函数来获取您将要连接的端口对应的新端口,因为您原来的端口可能存在端口冲突,sdk 已将该端口换成另一个端口。
函數原型:int dunGetCurrentTCPPort(const char* ip, int port)
參數:ip:转发规则中的客户连接 IP,也就是 127 开头的 IP
port:转发规则中的客户连接端口,也就是 127 开头 IP 的对应端口
返回:獲取到的新端口,如果傳入的端口沒有沖突或轉發規則不存在返回的將和傳入的端口一樣,如果有沖突返回的是改變後的新端口。 ? ?
下面是各系統下对应的 sdk 函数定义,具体调用示例可查看“demo 高级功能”里的项目?: ?
?Windows: ?
extern "C" CLINKAPI_API int dunGetCurrentTCPPort(const char* ip, int port); ?
?Android: ?
類:com.dun.clinkapi.Api ?
public native int dunGetCurrentTCPPort(String ip,int port); ?
?IOS 静态库: ?
類:ClinkAPI ?
int dunGetCurrentTCPPort(const char* ip, int port); ?
?IOS 动态库: ?
extern "C" void dunGetCurrentTCPPort(int val); ?
?Unity ?
類:ClinkSDKForUnity ?
public static int dunGetCurrentTCPPort(string ip, int port) ?
?Uni-app ?
插件name:dunClinkApiForUni ?
插件函數:dunGetCurrentTCPPort(ip,port)
?獲取當前udp對應端口
在新建 udp 连接前您要调用这个函数来获取您将要连接的端口对应的新端口,因为您原来的端口可能存在端口冲突,sdk 已将该端口换成另一个端口。
函數原型:int dunGetCurrentUDPPort(const char* ip, int port)
參數:ip:转发规则中的客户连接 IP,也就是 127 开头的 IP
port:转发规则中的客户连接端口,也就是 127 开头 IP 的对应端口
返回:獲取到的新端口,如果傳入的端口沒有沖突或轉發規則不存在返回的將和傳入的端口一樣,如果有沖突返回的是改變後的新端口。
下面是各系統下对应的 sdk 函数定义,具体调用示例可查看“demo 高级功能”里的项目?: ? ?
??Windows: ? ?
extern "C" CLINKAPI_API int dunGetCurrentUDPPort(const char* ip, int port); ? ?
?Android: ? ?
類:com.dun.clinkapi.Api ? ?
public native int dunGetCurrentUDPPort(String ip,int port); ? ?
?IOS 静态库: ? ?
類:ClinkAPI ? ?
int dunGetCurrentUDPPort(const char* ip, int port); ? ?
?IOS 动态库: ? ?
extern "C" void dunGetCurrentUDPPort(int val); ? ?
?Unity ? ?
類:ClinkSDKForUnity ? ?
public static int dunGetCurrentUDPPort(string ip, int port) ? ?
?Uni-app ? ?
插件name:dunClinkApiForUni ? ?
插件函數:dunGetCurrentUDPPort(ip,port) ?
?獲取客戶端IP:
用来在客户端获取该客户端当前的 IP。转发规则中“获取 IP 方式”无论设成什么, 这个接口都是有效的,这个是在客户端获取的,转发规则是给您的服务器端获取的,两个没有关系,只是获取到的客户端 IP 都是一样的。
??例如:您可以在用户登录时,把登录信息和客户端 IP 一起发送到登录服务器,这样如果你后端服务器存在多次转发的话也可获取到客户的真实 IP。
函數原型:long long dunGetClientIP()
返回:有符号 64 位小字头整数 IP 值,通过其它函数可转成字符串格式的 IP,返回 0,说明盾未启动或未启动成功。
将整数 IP 转成字符串格式 IP 算法代码如下:? ?
string ipstr = ip / 256 / 256 / 256 % 256 + "." + ip / 256 / 256 % 256 + "." + ip / 256 % 256 + "." + ip % 256;
下面是各系統下对应的 sdk 函数定义,具体调用示例可查看“demo 高级功能”里的项目?: ?
??Windows: ? ?
extern "C" CLINKAPI_API long long dunGetClientIP(); ? ?
??Android: ? ?
類:com.dun.clinkapi.Api ? ?
public native long dunGetClientIP(); ? ?
??IOS 静态库: ? ?
類:ClinkAPI ? ?
long long dunGetClientIP(); ? ?
??IOS 动态库: ? ?
extern "C" long long dunGetClientIP(); ? ?
??Unity ? ?
類:ClinkSDKForUnity ? ?
public static long dunGetClientIP() ? ?
??Uni-app ? ?
插件name:dunClinkApiForUni 插件函数:dunGetClientIP() ? ?
? ?
基礎基礎指南查看:遊戲盾SDK接入指南:從零開始的完整集成教程(2025最新版)?? ?
遊戲盾産品介紹:點擊查看 ?
遊戲盾價格表:點擊查看 ?