一部の欠陥:可変長データの送受信
バイナリ様式を送信別のキーワードテキスト(特定の順序で一緒にスプライスされた全てのフレームプロトコル)を使用し
キーワード:
クライアントは、バイナリ送信します
クライアントは、バイナリを受け取ります
Serverは、バイナリ送信します
Serverは、バイナリを受け取ります
送信DMIdataメッセージ
[引数] QueryCmd} {$ $ $ {} {ExpectLen ExpectData}
伝送バイナリパラメータ$ {QueryCmd} $ {ExpectData}を使用しての[ドキュメント]実施方法は0Xを追加する16進定数必要であり、$ {小数ExpectLen}
$} {dataLength_Ev( '1 1 + + + +1 ExpectLen} {$')評価を評価
$ {dataLength_hex dataLength_Ev長さ= 2つの{} $}を16進数に変換
変換整数} $ {16} QueryCmdに$ {QueryCmd_int
$ {QueryCmd_hex} $ {QueryCmd_int}長さ= 2つの16進数に変換
$ {ExpectLen_hex} $ {ExpectLen}長さ= 2つの16進数に変換
$ {ExpectData_int} $ {ExpectData} 16個の整数に変換
$ {length_hex}評価を評価する(「$を{ * 2} ExpectLen「)
$ {} ExpectData_hex ExpectData_intは$ {$} = {長さ} length_hexを16進数に変換します
$ {SENDMSG}設定された変数00 $ {dataLength_hex}0152万$ {QueryCmd_hex} $ {ExpectLen_hex} $ {ExpectData_hex}のFF
$ {SendMsg_by}進バイト$ {SENDMSG}に変換する
クライアントは、バイナリ$ {SendMsg_by}名= dmiclientを送信
注意点:
1.により団結を渡してテストパラメータには、記事では、入力パラメータが0xの16進渡され、そのインターフェイスは時間に渡され、また、我々は統一する必要があるが、プリフィックスの0xの文字列の連結を必要としない表示します、変換0xを削除するので、必要性
2. 2進数の長さと文字列の連結の後、我々はそれ以外の場合はエラーになり、送信するために、状況のバイトの\ X01としてバイトに変換によって変換する必要があります
3.このようなsocketTool 16進モードで表示
終了~~~それを送信
情報を受け取ります
メッセージDMIdata受信
[引数] $ {QueryCmd} $ {タイムアウト}
[ドキュメント] 0xのデータ列、パラメータ$ {QueryCmd}ヘキサバック受信する必要
...ダイレクト収率16進なら00に、それが空であることが表示され、解析できない
請求DMI文字列の形式で送信されるデータよう...
...ハンドル
返されたデータを送信するかどうかを比較1.コマンド数(0×00)と一致...
。 。2.比較データが05返された
... 3.印刷エラー値を返す
} $ = {RevMsgクライアントは、バイナリ名= dmiclientタイムアウトを受け取り=タイムアウト} $ {
$ {}は評価RevMsg_1 ""参加([ '$ {RevMsg}' [2 * I:2 *(I + 1)]の範囲(LEN( '$ {RevMsg}')/ 2)でI用])
$ {RevMsg_2}評価'$ {RevMsg_1}'。スプリット( "")
に換算整数RevMsg_2}を{$の[7] 16 INT $ {}
INT = 0xを接頭語長= 2 $は{変換Hexに$ {}}をヘクス
$ {$であることが等しくなければならないQueryCmd} {}ヘクス
の均等RevMsg_2は}である必要があり、{$の[6] 05
ログ特定の印刷エラー戻り値:$ {RevMsg_2} [7: ]
注意点:
ヌルバイトを受信した場合、通常のソフトウェアは、私は、このキーワードを直接空現れる受け、00を発見進データを送信する場合、確認するので、キーワードがデータを受信1. ASCIIコードに応じて受信されます時間は、それが実際に方法が適切ではないされ、受け取ることができません。一時的な解決策は、開発者が直接、直接私に文字列を返す文字列をチェックできるようにすることです
受信された前記文字列は、分割する必要があり、位置に対応する値をとり、検証します
利点:プロトコルを開発する必要はありません、テンプレート
問題:文字列連結(必要な種々の変換を転送するための別の方法で必要な入力パラメータ)
吐き気点:ASCIIコードが受信された直接00進データを受信したが空の場合、それはNULLバイトを受信し、(血液嘔吐)復号することができません