StoneCDN

Guía de integración del sdk GameShield (Biblioteca nativa versión 2025)

14 Ene, 2025 stonecdn

Preparación previa a la integración

Antes de iniciar la integración, se recomienda ordenar su propio negocio, confirmar qué negocios necesitan acceder al SDK, y especificar los correspondientes puertos de negocio, nombres de dominio, e IPs de servidor de negocio (Nota: las IPs de servidor de negocio no deben haber sido expuestas en la red pública, y no pueden ser obtenidas a través de la resolución, y es preferible aislarlas del resto del negocio).

Crear una instancia de acceso al SDK queLa creación exitosa obtendrá AppID y AppKey.

Configuración de reglas de reenvío

Cada regla de reenvío debe identificar la clave de reenvío (que representa de forma única una regla de reenvío), el nombre IP/dominio del servidor de origen, el puerto y el protocolo de comunicación (tcp/udp)

Proceso de acceso

Basta con llamar a las siguientes interfaces obligatorias.

  • Llame a la inicialización de la interfaz Init, pasar los parámetros AppID, AppKey (se requieren dos parámetros, debe ser llamado). Inicio del cliente tan pronto como sea posible después de la inicialización, y la inicialización de un bien (app cortar fondo y luego cortar de nuevo a la necesidad de volver a llamar).
  • Llame a la interfaz GetTCPServerAddr para obtener la IP y el puerto del proxy TCP local (necesarios para el reenvío TCP).
  • Llama a la interfaz GetClientIP para obtener la IP real del cliente (elige si llamarla o no según el negocio, no es obligatorio).
  • Los datos comerciales se encapsulan de vuelta a la fuente a través del encabezado de solicitud X-Forward-For en el protocolo HTTP o en TCP.
  • Establezca un enlace con el agente local y envíe la solicitud.

Consideraciones sobre la integración

  • Android, IOS, PC, no importa http, tcp, websocket, cada vez que se inicia una solicitud, desconectar y volver a conectar, así como ios reanudar el programa después de bloquear la pantalla, tiene que volver a llamar GetTCPServerAddr, y no se puede almacenar en caché el resultado de retorno anterior. Debido a que el sistema puede cerrar el puerto proxy local, sin volver a llamar a la interfaz directamente para construir una conexión se construirá un fallo de conexión, dando lugar a excepciones de negocio.
  • Android proporciona armeabi-v7a, x86, x86_64, arm64-v8 versiones de las bibliotecas dinámicas, puede ser compatible con todos los dispositivos Android, hay otros SDK de terceros necesitan para mantener los archivos de la biblioteca coherente, de lo contrario puede conducir a la caída del programa.
  • Si es necesario bloquear el simulador.Póngase en contacto con el Servicio Técnico.
  • ios Proporcionamos archivos .a que se integran perfectamente (los dispositivos anteriores al iphone5 ya no son compatibles).
  • El procesamiento de red del lado del cliente debe ser más robusto, por ejemplo, gestión del tiempo de espera, reconexión tras desconexión.
  • Los nodos SDK son grandes y cambian irregularmente, se recomienda desactivar la política de seguridad de origen.

Ejemplo de acceso a cada plataforma

El siguiente ejemplo introduce las interfaces necesarias para acceder al SDK, la llamada completa puede ver el ejemplo de código completo

  • Android (sistema operativo)

Entorno de ejecución: versión del sistema Android 4.1 y superior Introducir Android SDK en el proyecto.

ejemplo de código

import com.xshield.jni.ShieldService; boolean succeed = ShieldService.Init("$AppID", " $AppKey "); // devuelve true si la inicialización se ha realizado correctamente
String addr = ShieldService.GetTcpProxyAddr("prueba.com"); connect(addr); // devuelve true si la inicialización se ha realizado correctamente.
connect(addr);

Establecer una conexión a través de la IP y el puerto del paso anterior para enviar y recibir datos de negocio (se recomienda ejecutarlo una vez finalizada la inicialización para evitar atascos en el hilo de la interfaz de usuario).
Obtener la IP y el puerto del proxy de seguridad para evitar interferencias en los hilos de la interfaz de usuario.
Inicializar el SDK (pasar el AppID y el AppKey obtenidos a la interfaz)

  • IOS

entorno operativoiOS 8.0 y superior, añade el SDK IOS al proyecto de la aplicación.

Abre el proyecto de aplicación usando XCode y añade libxshield.a al proyecto.

ejemplo de código

XShieldIOS *sdk = [[XShieldIOS alloc] init];
[sdk init: @"$AppID " appKey: @" $AppKey "]; // una inicialización correcta devuelve true
#include "xshield-ios.h"
NSString* addr = [sdk getTCPAddr:@"prueba.com"];
connect(addr);

Establezca una conexión a través de la IP y el puerto del paso anterior para enviar y recibir datos de servicio.
Obtenga la IP y el puerto del proxy de seguridad (aquí tiene un ejemplo de docking configurado para reenvío TCP)
Inicialice el SDK (pase la AppID y la AppKey obtenidas a la interfaz).

Integración Aceptación

Análisis de captura de paquetes del lado del cliente para ver si la IP de origen está expuesta. (Se necesita un ordenador que pueda compartir la red hotspot e instalar un software de captura de paquetes, como wireshark). Comparta el hotspot del PC (el software de hotspot wifi o el sistema viene con función de hotspot), conecte el teléfono móvil a la red de hotspot, abra el software de captura de paquetes y, a continuación, abra el software, pruebe todos los servicios varias veces y compruebe si se puede capturar la IP de origen del servicio. Compruebe si hay algún otro nombre de dominio analizado a la IP de origen, si lo hay.Segregación operativa recomendada.
Para obtener la IP real, la empresa confirma si es normal obtener la IP real del usuario, y si no consigue obtener la IP del nodo de alta defensa, puede obtener la IP del nodo de alta defensa.IP misma tecnología confirmación disponible.
Prueba de negocios antes de ir en vivo, se recomienda hacer más pruebas antes de ir en vivo, puede ser gris prueba de 2 ~ 3 días, y luego la actualización global.

Integración SDKPreguntas frecuentes

1. Resolución de conflictos entre puertos

Tras años de observación y estadísticas, el problema del conflicto de puertos sólo se produce en dispositivos cliente individuales y la probabilidad de que ocurra es baja. Pero para resolver el problema de una vez por todasSin embargo, le recomendamos que utilice nuestras funciones avanzadas para resolver este problema por completo.

Dado que nuestro sdk abre los puertos apropiados en los dispositivos cliente de acuerdo con las "reglas de reenvío" que configures, hay una probabilidad muy baja de que se produzcan conflictos de puertos en clientes individuales.

Existen dos tipos de conflictos entre puertos:

  • Escenario 1: Un puerto que usted configuró ya está ocupado por otra aplicación en un cliente individual, por lo que ese usuario no puede usar su aplicación normalmente;
  • El segundo escenario: tiene varias aplicaciones que utilizan la misma instancia, y los usuarios a veces abren varias aplicaciones en el mismo dispositivo al mismo tiempo; la primera aplicación que abre el usuario ocupa todos los puertos de su instancia, y la segunda aplicación se abre en un puerto que no se puede abrir al mismo tiempo.

Este problema está bien en PC, el negocio de la segunda aplicación abierta es normal, porque la segunda aplicación se conectará al sdk a través de la primera aplicación, pero en el móvil habrá un problema, la segunda aplicación sigue siendo normal al principio, porque entonces la segunda aplicación se conectará al sdk a través de la primera aplicación, la primera aplicación se cortará a un segundo plano mientras el usuario está utilizando la segunda aplicación, después de un tiempo la primera aplicación no podrá conectarse. Después de un tiempo la primera app puede ser hibernada por el sistema y entonces la segunda app no podrá conectarse.

La solución a este problema es bastante sencilla.El procedimiento de codificación es el siguiente::

dunSetAutoChangePort(1);//establecer para cambiar automáticamente el puerto de conflicto, sólo es necesario llamar una vez

int ret = clinkStart(key);//escudo de inicio, algunos sistemas utilizan inicio ver otro documento, sólo necesita ser llamado una vez

//En caso de una nueva conexión, llame a la siguiente línea de código para obtener un nuevo puerto.

int new_tcpPort = dunGetCurrentTCPPort("127.0.10.21", 600);//Obtener el nuevo puerto tcp.

// a continuación usa new_tcpPort para conectarte a la aplicación

//connect("127.0.10.21", new_tcpPort) Por ejemplo esta línea de pseudo-código

Como ejemplo, digamos que la regla de reenvío es 127.0.10.21:600 a 101.21.31.5:600.Comparación del pseudocódigo antes y después de integrar Shield y resolver los conflictos de puertos sin integración de Shield.

Conexión antes de la integración del escudo connect("101.21.31.5",600)

Conexión después de la integración del escudo connect("127.0.10.21", dunGetCurrentTCPPort("127.0.10.21",600))

1.1 Configuración de la sustitución automática de puertos conflictivos

Esta función debe añadirse aLa llamada sólo es válida si se realiza antes de la llamada a shieldstart..

Prototipo de función: void dunSetAutoChangePort(int val)

  • parámetros: val: auto-reemplazar o no. 0: no auto-reemplazar, 1: auto-reemplazar a un nuevo puerto cuando el puerto entra en conflicto.
  • funcionalidadCuando val se establece en 1, si el escudo detecta que un puerto está ocupado o no hay ninguna otra razón para abrir este puerto, se generará automáticamente un puerto aleatorio disponible y asociar este puerto aleatorio con el puerto original, de modo que su programa puede utilizar las funciones dunGetCurrentTCPPort o dunGetCurrentUDPPort proporcionadas por sdk para obtener el puerto recién generado y utilizar el nuevo puerto para conectarse. dunGetCurrentUDPPort función proporcionada por sdk para obtener el nuevo puerto generado y utilizar el nuevo puerto para conectarse, lo que resuelve el problema de conflicto de puertos.

Aquí están las correspondientes definiciones de función sdk para cada sistema.Consulte el proyecto en "demo Funciones avanzadas" para ver un ejemplo de llamada.::

Ventanas: 
extern "C" CLINKAPI_API void dunSetAutoChangePort(int val).

androide: 
Clase: cn.ay.clinkapi.

public void nativo dunSetAutoChangePort(int val).

Bibliotecas estáticas IOS: 
 Clase: ClinkAPI
void dunSetAutoChangePort(int val).

Bibliotecas dinámicas IOS:
 extern "C" void dunSetAutoChangePort(int val);.

Unidad 
Clase: ClinkSDKForUnity
 public static void dunSetAutoChangePort(int val)

Uni-app 
Nombre del plugin: ayClinkApiForUni
Función del plugin: dunSetAutoChangePort(val)

1.2Obtener el puerto tcp actual

Antes de hacer una nueva conexión tcp necesitas llamar a esta función para obtener el nuevo puerto correspondiente al puerto al que te vas a conectar, porque tu antiguo puerto puede tener un conflicto de puertos y sdk lo ha reemplazado por otro puerto.

  • prototipo de función: int dunGetCurrentTCPPort(const char* ip, int port)
  • parámetrosip: IP de conexión del cliente en la regla de reenvío, es decir, la IP que empieza por 127 port: puerto de conexión del cliente en la regla de reenvío, es decir, el puerto correspondiente de la IP que empieza por 127
  • volver (o regresar)Si el puerto entrante no tiene conflicto o la regla de reenvío no existe, el puerto devuelto será el mismo que el puerto entrante, si hay conflicto, el puerto devuelto será el nuevo puerto después del cambio.

A continuación figuran las definiciones de las correspondientes funciones del sdk para cada sistema, véase "demo Funciones avanzadas"Artículos en:

Ventanas:
extern "C" CLINKAPI_API int dunGetCurrentTCPPort(const char* ip, int port);

android:
Clase: cn.ay.clinkapi.
public nativo int dunGetCurrentTCPPort(String ip,int puerto);;

Bibliotecas estáticas IOS:
Clase: ClinkAPI
int dunGetCurrentTCPPort(const char* ip, int port);

Bibliotecas dinámicas IOS:
extern "C" void dunGetCurrentTCPPort(int val).

Unidad
Clase: ClinkSDKForUnity
public static int dunGetCurrentTCPPort(cadena ip, int puerto)

Uni-app
Nombre del plugin: ayClinkApiForUni
Función del plugin: dunGetCurrentTCPPort(ip,port)

1.3 Obtener el puerto udp actual correspondiente

Antes de hacer una nueva conexión udp necesitas llamar a esta función para obtener el nuevo puerto correspondiente al puerto al que te vas a conectar, porque puede haber un conflicto de puertos en tu antiguo puerto, y sdk lo ha reemplazado por otro puerto.

  • prototipo de función: int dunGetCurrentUDPPort(const char* ip, int port)
  • parámetrosip: IP de conexión del cliente en la regla de reenvío, es decir, la IP que empieza por 127 port: puerto de conexión del cliente en la regla de reenvío, es decir, el puerto correspondiente de la IP que empieza por 127
  • volver (o regresar): Obtiene el nuevo puerto, si el puerto entrante no tiene conflicto o la regla de reenvío no existe el retorno será el mismo que el puerto entrante, si hay conflicto el retorno es el nuevo puerto después del cambio.

A continuación figuran las definiciones de las correspondientes funciones del sdk para cada sistema, véase "demo Funciones avanzadas"Artículos en:

Ventanas: 
extern "C" CLINKAPI_API int dunGetCurrentUDPPort(const char* ip, int port);

androide: 
Clase: cn.ay.clinkapi.
public nativo int dunGetCurrentUDPPort(String ip,int puerto);;

Bibliotecas estáticas IOS: 
 Clase: ClinkAPI
int dunGetCurrentUDPPort(const char* ip, int puerto);

Bibliotecas dinámicas IOS: 
 extern "C" void dunGetCurrentUDPPort(int val).

Unidad 
Clase: ClinkSDKForUnity
 public static int dunGetCurrentUDPPort(cadena ip, int puerto)

Uni-app 
Nombre del plugin: ayClinkApiForUni
Función del plugin: dunGetCurrentUDPPort(ip,port)

2. Otras funciones

2.1 Obtener la IP del cliente

Se utiliza para obtener la IP actual del cliente en el lado del cliente, no importa lo que el "método Get IP" en la regla de reenvío se establece en, esta interfaz sigue siendo válida, esto es para el lado del cliente para obtener, la regla de reenvío es para su lado del servidor para obtener.Ambas cosas no tienen nada que ver.La IP del cliente es la misma que la IP del cliente, pero la IP del cliente es la misma que la IP del cliente.

Por ejemplo, puede enviar la información de inicio de sesión junto con la IP del cliente al servidor de inicio de sesión cuando el usuario inicie sesión, de modo que pueda obtener la IP real del cliente si su servidor back-end la ha reenviado muchas veces.

  • Prototipo de la función: long long dunGetClientIP()
  • Devuelve: valor IP entero de 64 bits con signo, puede ser convertido a IP cadena por otras funciones, devolver 0 significa que el escudo no se inició o no se inició correctamente Convertir IP entero a IP cadena El código del algoritmo es el siguiente::
cadena ipstr = ip / 256 / 256 % 256 + "." + ip / 256 / 256 % 256 + "." + ip / 256 % 256 + "." + ip % 256.

A continuación figuran las definiciones de las correspondientes funciones del sdk para cada sistema, véase "demo Funciones avanzadas"Artículos en:

Ventanas:
extern "C" CLINKAPI_API long long dunGetClientIP();

androide:
Clase: cn.ay.clinkapi.
public long nativo dunGetClientIP();

Bibliotecas estáticas IOS:
Clase: ClinkAPI
long long dunGetClientIP();

Bibliotecas dinámicas IOS:
extern "C" long long dunGetClientIP();

Unidad
Clase: ClinkSDKForUnity
public static long dunGetClientIP()

Uni-app
Nombre del plugin: ayClinkApiForUni
Función del plugin: dunGetClientIP()

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *