PHPネットワーク通信プログラムを作成するときは、特定のプロトコル形式に準拠するバイナリデータパケットを構築する必要があることがよくあります。この場合、 Pack()関数は不可欠なツールです。指定された形式でPHP変数をバイナリ文字列にパッケージ化することができ、基礎となるネットワークまたはハードウェアとの通信に便利です。
pack()はPHPに組み込み関数であり、その基本的な構文は次のとおりです。
string pack(string $format, mixed ...$values)
$フォーマットは、後続のデータをパッケージ化する方法を指定するために使用されるフォーマット文字列です。
$値は、パッケージ化する必要がある値です。
PACK()を介して生成されるデータは通常、TCP/IPプロトコルの要求メッセージ、ゲームサーバーのクライアントメッセージ、モノのインターネットセンサーの報告データなど、特定の通信プロトコル形式に準拠するバイナリ構造を構築するために使用されます。
一般的な形式の文字とその意味は次のとおりです。
フォーマット文字 | 説明する | 占有されているバイト数 |
---|---|---|
c | 署名のないチャー(8ビット) | 1 |
n | 符号なしの短い(16ビット、ネットワークエンディアン) | 2 |
n | 署名の長いロング(32ビット、ネットワークのエンディアンネス) | 4 |
a | nul完成した文字列(指定された長さ) | 変数 |
a | スペースが満たされた文字列(指定された長さ) | 変数 |
h | 16進に関する文字列(高いビット優先度) | 2バイトごとに |
x | バイトに記入します(1バイトをスキップ) | 1 |
ネットワークプロトコルでは、 NとNは「ネットワークエンディアン」(ビッグエンディアンエンディアン)であり、クロスプラットフォーム通信に適しているため、特に一般的です。
プロトコルパケットを構築する必要があると仮定します。構造は次のとおりです。
1バイト:バージョン番号(符号なし8ビット)
2バイト:メッセージタイプ(符号なし16ビット)
4バイト:ユーザーID(署名されていない32ビット)
10バイト:ユーザー名(ASCII、スペース充填)
次の方法でpack()を使用できます。
<?php
$version = 1; // 1 バイト
$type = 100; // 2 バイト
$userId = 123456789; // 4 バイト
$username = 'Alice'; // ほとんど 10 バイト,完全なスペース
$packet = pack('CnNA10', $version, $type, $userId, $username);
echo bin2hex($packet); // パッケージ化された16進の結果を表示します
?>
このコードによって生成された$パケットは、プロトコル形式に準拠し、ソケットまたはストリームを介してリモートサービスに直接送信できるバイナリデータです。
リモートサーバーアドレスがM66.NETで、ポートが9000であると仮定すると、TCP接続を介して上記のバイナリデータを送信できます。
<?php
$fp = stream_socket_client("tcp://m66.net:9000", $errno, $errstr, 5);
if (!$fp) {
die("接続に失敗しました: $errstr ($errno)");
}
// データパケットの構築
$packet = pack('CnNA10', 1, 100, 123456789, 'Alice');
// データを送信します
fwrite($fp, $packet);
// 応答を受け取ります
$response = fread($fp, 1024);
// 接続を閉じます
fclose($fp);
echo "サーバーの応答: " . bin2hex($response);
?>
これは、Pack()を使用してバイナリパッケージを構築し、リモートサーバー( M66.netなど)に送信する完全な基本プロセスです。
bin2hex()またはunpack()を使用して、パッケージ化されたデータが期待を満たしていることを表示および確認します。
Wiresharkなどのネットワークパケットキャプチャツールを使用して、送信されたデータを分析します。
エンディアンネスに注意してください。ほとんどのネットワークプロトコルは、ネットワークバイトの注文形式を使用しています。
Pack()は、基礎となるバイナリプロトコルを処理するためのPHPの強力なツールです。マスタリングは、C/C ++サーバーと効率的に通信するのに役立つだけでなく、さまざまなカスタマイズされたプロトコル設計を実装するのにも役立ちます。ゲーム開発、モノのインターネットコミュニケーション、または独自のアプリケーション層プロトコルの構築を行っているかどうかにかかわらず、 Pack()は、詳細な理解とアプリケーションに値する機能です。