統合前の準備
統合を開始する前に、ご自身のビジネスを整理し、どのビジネスがSDKにアクセスする必要があるかを確認し、対応するビジネスポート、ドメイン名、ビジネスサーバーIPを指定することをお勧めします(注:ビジネスサーバーIPはパブリックネットワーク上に公開されていない必要があり、解決を通じて取得することはできません。)
以下のSDKアクセスインスタンスを作成する。作成に成功すると、AppIDとAppKeyが得られる。
転送ルールの設定
各転送ルールは、転送キー(転送ルールを一意に表す)、転送元サーバーのIP/ドメイン名、ポート、通信プロトコル(tcp/udp)を識別する必要がある。
アクセス・プロセス
以下の必須インターフェースを呼び出すだけだ。
- コールInitインターフェイスの初期化は、パラメータAppID、AppKey(2つのパラメータが必要であり、呼び出す必要があります)で渡す。 クライアントは、初期化後、できるだけ早く開始し、良いの初期化(アプリは、バックグラウンドカットし、再コールする必要性に戻ってカット)。
- GetTCPServerAddrインタフェースを呼び出して、ローカルのTCPプロキシIPとポート(TCP転送に必要)を取得する。
- GetClientIPインターフェイスを呼び出して、クライアントの実際のIPを取得する(業務に応じて呼び出すかどうかを選択する。)
- ビジネスデータは、HTTPプロトコルのリクエストヘッダX-Forward-ForまたはTCPのリクエストヘッダX-Forward-Forを介して、ソースにカプセル化されて返される。
- ローカルエージェントとのリンクを確立し、リクエストを送信する。
統合に関する考察
- Android、IOS、PC、http、tcp、websocketに関係なく、リクエストを開始し、切断し、再接続するたびに、iosが画面をロックした後にプログラムを再開するだけでなく、GetTCPServerAddrを再コールする必要があり、前の戻り結果をキャッシュすることはできません。システムは、ローカルプロキシポートを閉じる可能性があるため、接続を構築するために直接インターフェイスを呼び出すことなく、接続の失敗を構築し、ビジネスの例外が発生します。
- Androidは、動的ライブラリのarmeabi-v7a、x86、x86_64、arm64-v8バージョンを提供し、すべてのAndroidデバイスと互換性があることができ、他のサードパーティのSDKは、ライブラリファイルの一貫性を維持する必要があり、それ以外の場合は、プログラムのクラッシュにつながる可能性があります。
- シミュレーターをブロックする必要がある場合。テクニカル.
- ios 問題なく統合できる.aファイルを提供します(iphone5以前のデバイスはサポートされなくなりました)。
- クライアント側のネットワーク処理は、タイムアウト処理、切断後の再接続など、より堅牢である必要がある。
- SDKノードが大きく、不定期に変更される場合は、ソースセキュリティポリシーをオフにすることをお勧めします。
各プラットフォームへのアクセス例
次の例は、SDKにアクセスするために必要なインターフェイスを紹介し、完全な呼び出しは、完全なコード例を見ることができます。
- アンドロイド
動作環境:Android 4.1以上のシステムバージョン Android SDKをプロジェクトに導入する。
コード例
import com.xshield.jni.ShieldService; boolean succeed = ShieldService.Init("$AppID", " $AppKey "); // 初期化に成功したらtrueを返す。
String addr = ShieldService.GetTcpProxyAddr("test.com"); connect(addr); // 初期化に成功したらtrueを返す。
connect(addr);
ビジネス・データを送受信するために、前のステップで使用したIPとポートを経由して接続を確立する(UIスレッドの妨害を避けるために、初期化が完了した後に実行することを推奨します)。
UIのスレッドを妨害しないように、セキュア・プロキシのIPとポートを取得する。
SDKを初期化する(取得したAppIDとAppKeyをインターフェイスに渡す)
- IOS
動作環境iOS 8.0以上では、アプリのプロジェクトにIOS SDKを追加します。
XCodeを使ってアプリケーション・プロジェクトを開き、libxshield.aをプロジェクトに追加する。
コード例
XShieldIOS *sdk = [[XShieldIOS alloc] init];
[sdk init: @"$AppID " appKey: @" $AppKey "]; // 初期化に成功すると、trueが返されます。
#include "xshield-ios.h"
NSString* addr = [sdk getTCPAddr:@"test.com"];
connect(addr);
サービスデータを送受信するために、前のステップで使用したIPとポートを介して接続を確立する。
セキュリティプロキシーのIPとポートを取得する。
SDKを初期化する(取得したAppIDとAppKeyをインターフェースに渡す)。
統合の受け入れ
クライアント側のパケットキャプチャ分析により、ソースIPが公開されているかどうかを確認する。(ホットスポットネットワークを共有でき、wiresharkなどのパケットキャプチャソフトウェアをインストールできるコンピュータが必要)。PCのホットスポットを共有し(wifiホットスポットソフトウェアまたはシステムにホットスポット機能が付属している)、携帯電話をホットスポットネットワークに接続し、パケットキャプチャソフトウェアを開き、ソフトウェアを開き、すべてのサービスを数回テストし、サービスのソースIPがキャプチャできるかどうかを確認します。 ソースIPに分析された他のドメイン名がある場合は、そのドメイン名があるかどうかを確認します。推奨される運用分離.
実IPを取得するために、事業者は利用者の実IPを取得することが正常かどうかを確認し、取得できなかった場合は、高防御ノードのIPを取得することがある。IP 同じ技術の確認が可能.
本番前のビジネステストでは、本番前に多くのテストを行うことをお勧めします。
SDKの統合よくある質問
1.ポートの競合の解決
長年の観測と統計の結果、ポートの衝突問題は個々のクライアント・デバイスでのみ発生し、発生確率は低い。 しかし、この問題をきっぱりと解決するにはしかし、この問題を完全に解決するには、高度な機能を使用することをお勧めします。
私たちのSDKは、あなたが設定した「転送ルール」に従ってクライアント・デバイス上で適切なポートを開くので、個々のクライアントでポートの競合が発生する可能性は非常に低くなります。
ポートの競合には2種類ある:
- シナリオ1:あなたが設定したポートが、個々のクライアント上の別のアプリケーションによってすでに占有されているため、そのユーザーはあなたのアプリケーションを正常に使用できません;
- 2つ目のシナリオ:同じインスタンスを使用する複数のアプリがあり、ユーザーが同じデバイスで複数のアプリを同時に開くことがある。ユーザーが開いた最初のアプリはインスタンスのすべてのポートを占有し、2つ目のアプリは同時に開くことができないポートで開く。
この問題は、PC上では、2つ目のアプリが最初のアプリを介してsdkに接続されるため、2つ目のアプリが開いている状態は正常なのですが、モバイル上では問題が発生します。しばらくすると、最初のアプリはシステムによってハイバネーションされ、2番目のアプリは接続できなくなります。
この問題の解決策はいたってシンプルだ。コード手順は以下の通り。::
dunSetAutoChangePort(1);//競合ポートを自動的に変更するように設定する。
int ret = clinkStart(key);//シールドを開始、システムによっては別のドキュメントを参照して開始を使用します。
//新しい接続があった場合、以下のコードを呼び出して新しいポートを取得する。
int new_tcpPort = dunGetCurrentTCPPort("127.0.10.21", 600);//新しいTCPポートを取得する。
// 次にnew_tcpPortを使ってアプリケーションに接続する。
//connect("127.0.10.21", new_tcpPort) 例えば、次のような擬似コードがあります。
例として、転送ルールが127.0.10.21:600から101.21.31.5:600だとする。Shieldを統合する前と後の擬似コードの比較、およびShieldを統合せずにポートの競合を解決する。
シールド統合前の接続 connect("101.21.31.5",600)
シールド統合後の接続 connect("127.0.10.21", dunGetCurrentTCPPort("127.0.10.21",600))
1.1 競合するポートを自動的に置き換えるかどうかの設定
この関数はこの呼び出しは、shieldstartへの呼び出しの前に行われた場合のみ有効である。.
関数プロトタイプ: void dunSetAutoChangePort(int val)
- パラメーター0:自動交換しない、1:ポートが競合した場合、新しいポートに自動交換する。
- 官能性valが1に設定されている場合、ポートが占有されているか、このポートを開く理由が他にないことをシールドが検出すると、利用可能なランダムなポートを自動的に生成し、このランダムなポートを元のポートに関連付けます。このため、プログラムはsdkが提供するdunGetCurrentTCPPort関数またはdunGetCurrentUDPPort関数を使用して、新しく生成されたポートを取得し、新しいポートを使用して接続できます。sdkが提供するdunGetCurrentUDPPort関数を使用して新しく生成されたポートを取得し、新しいポートを使用して接続することで、ポートの競合問題が解決されます。
以下は、各システムに対応するsdk関数の定義である。呼び出し方の例については、「demo Advanced Functions」のプロジェクトを参照のこと。::
ウィンドウズ
extern "C" CLINKAPI_API void dunSetAutoChangePort(int val).
アンドロイド
クラス: cn.ay.clinkapi.
public native void dunSetAutoChangePort(int val)。
IOSの静的ライブラリ:
クラス: ClinkAPI
void dunSetAutoChangePort(int val).
IOSダイナミックライブラリ:
extern "C" void dunSetAutoChangePort(int val);.
団結
クラス: ClinkSDKForUnity
public static void dunSetAutoChangePort(int val)
ユニアプリ
プラグイン名:ayClinkApiForUni
プラグイン関数:dunSetAutoChangePort(val)
1.2現在のTCPポートを取得
新しいtcp接続を行う前に、接続先のポートに対応する新しいポートを取得するためにこの関数を呼び出す必要があります。
- 関数原型: int dunGetCurrentTCPPort(const char* ip, int port)
- パラメーターip:転送ルールにおけるクライアント接続IP、すなわち127で始まるIP port:転送ルールにおけるクライアント接続ポート、すなわち127で始まるIPの対応するポート
- かえる受信ポートに競合がないか、転送ルールが存在しない場合、返されるポートは受信ポートと同じになり、競合がある場合、返されるポートは変更後の新しいポートになる。
以下は、各システムに対応するsdk関数の定義である。デモの高度な機能"の項目:
ウィンドウズ
extern "C" CLINKAPI_API int dunGetCurrentTCPPort(const char* ip, int port);
アンドロイド:
クラス: cn.ay.clinkapi.
public native int dunGetCurrentTCPPort(String ip,int port);;
IOSの静的ライブラリ:
クラス: ClinkAPI
int dunGetCurrentTCPPort(const char* ip, int port);
IOSダイナミックライブラリ:
extern "C" void dunGetCurrentTCPPort(int val).
団結
クラス: ClinkSDKForUnity
public static int dunGetCurrentTCPPort(string ip, int port)
ユニアプリ
プラグイン名:ayClinkApiForUni
プラグイン関数:dunGetCurrentTCPPort(ip,port)
1.3 現在のudp対応ポートの取得
新しいudp接続を行う前に、接続先のポートに対応する新しいポートを取得するためにこの関数を呼び出す必要があります。
- 関数原型: int dunGetCurrentUDPPort(const char* ip, int port)
- パラメーターip:転送ルールにおけるクライアント接続IP、すなわち127で始まるIP port:転送ルールにおけるクライアント接続ポート、すなわち127で始まるIPの対応するポート
- かえる受信ポートに競合がないか、転送ルールが存在しない場合は、受信ポートと同じポートが返され、競合がある場合は、変更後の新しいポートが返されます。
以下は、各システムに対応するsdk関数の定義である。デモの高度な機能"の項目:
ウィンドウズ
extern "C" CLINKAPI_API int dunGetCurrentUDPPort(const char* ip, int port);
アンドロイド
クラス: cn.ay.clinkapi.
public native int dunGetCurrentUDPPort(String ip,int port);;
IOSの静的ライブラリ:
クラス: ClinkAPI
int dunGetCurrentUDPPort(const char* ip, int port);
IOSダイナミックライブラリ:
extern "C" void dunGetCurrentUDPPort(int val).
団結
クラス: ClinkSDKForUnity
public static int dunGetCurrentUDPPort(string ip, int port)
ユニアプリ
プラグイン名:ayClinkApiForUni
プラグイン関数:dunGetCurrentUDPPort(ip,port)
2.その他の機能
2.1 クライアントIPの取得
クライアント側でクライアントの現在のIPを取得するために使用される。転送ルールの「IP取得メソッド」がどのように設定されていても、このインターフェースは有効である。この2つは互いに何の関係もない。その場合、クライアントIPはクライアントIPと同じになる。
例えば、ユーザーがログインする際に、ログイン情報をクライアントIPと一緒にログインサーバーに送信することで、バックエンドサーバーが何度も転送した場合に、クライアントの本当のIPを取得することができます。
- 関数プロトタイプ: long long dunGetClientIP()
- 戻り値:符号付き64ビット整数IP値、他の関数で文字列IPに変換可能、戻り値0はシールドが起動しなかったか、正常に起動しなかったことを意味する 整数IPを文字列IPに変換する アルゴリズムコードは以下の通り。::
文字列 ipstr = ip / 256 / 256 / 256 % 256 + ".". + ip / 256 / 256 % 256 + ".". + ip / 256 % 256 + ".". + ip % 256.
以下は、各システムに対応するsdk関数の定義である。デモの高度な機能"の項目:
ウィンドウズ
extern "C" CLINKAPI_API long long dunGetClientIP();
アンドロイド
クラス: cn.ay.clinkapi.
public native long dunGetClientIP();
IOSの静的ライブラリ:
クラス: ClinkAPI
long long dunGetClientIP();
IOSダイナミックライブラリ:
extern "C" long long dunGetClientIP();
団結
クラス: ClinkSDKForUnity
public static long dunGetClientIP()
ユニアプリ
プラグイン名: ayClinkApiForUni
プラグイン関数: dunGetClientIP()