次の例は、完全なカスタム TCP/IP ベース プロトコルを使用するアプリケーションからのものです。このプロトコルで、クライアント リクエストとサーバー レスポンス データの両方が、固定長フィールドで構成される事前定義メッセージのテレグラム構造のセットに従います。いくつかのフィールドはバイナリであり (よって、0 バイトの可能性があります),いくつかのフィールドは文字列型になります。
記録したトラフィックからの典型的なリクエスト/レスポンス ペアを示します:
WebTcpipConnect(hWeb0, "10.9.96.81", 3311); WebTcpipSendBin(hWeb0, "\h00000280000000000000000000000000" // ················ "\h000100000000000000004F4B36302020" // ··········OK60 ... "\h303030302B3030303030303030303030" // 0000+00000000000 "\h30303030000000000000000000000000" // 0000············ , 640); WebTcpipRecvExact(hWeb0, NULL, 80); WebTcpipShutdown(hWeb0);
記録ログからのサーバー レスポンスを示します。上記のスクリプトで、WebTcpipRecvExact 関数の 3 番目の引数を元に、80 バイトが含まれていることが既にわかっています。
00 00 00 00 ···P············ 00 00 00 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 ··········OK60 00 01 00 00 00 00 00 00 00 00 4F 4B 36 30 20 20 00 00 00 20 ··U60OKS1 SILK 20 20 00 00 55 36 30 4F 4B 53 31 20 53 49 4C 4B 00 00 00 30 01 ············ 30 31 20 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 ················ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
カスタマイズ後のスクリプトを以下に示します。次にご注意ください。
結果を以下に示します。
ResetRequestData(); AppendRequestData("\h00000280000000000000000000000000" "\h00010000000000000000", 26); AppendRequestData("OK60 "); AppendRequestData("\h0000", 2); AppendRequestData(sUser + sPassword); // ... (some more lines not displayed here) MeasureStart("Write Journal"); WebTcpipConnect(hWeb0, "10.9.96.81", 3311); SendTcpipRequest(hWeb0); WebTcpipRecvProto(hWeb0, 0, 4, TCP_FLAG_INCLUDE_PROTO, sResponse, sizeof(sResponse), nReceived); // ... (response verification not displayed here) WebTcpipShutdown(hWeb0); MeasureStop("Write Journal");
次の記録ルール XML ファイルは、Silk Performer Rcorder を、WebTcpipRecvExact の場所に正しい WebTcpipRecvProto 呼び出しを生成するように設定します。Identify ノードの設定は、上記のスクリプトで WebTcpipRecvProto の引数にマップします。
<?xml version="1.0" encoding="UTF-8"?> <RecordingRuleSet> <TcpRuleRecvProto> <Name>My custom TCP protocol</Name> <Identify> <LengthOffset>0</LengthOffset> <LengthLen>4</LengthLen> <OptionFlags>ProtoIncluded</OptionFlags> </Identify> </TcpRuleRecvProto> </RecordingRuleSet>