ネットワークプログラミングでは、データ送信はプロトコル形式に厳密に従って、送信および受信先がデータを正しく解析できるようにする必要があります。 PHPのpack()関数は、指定された形式のバイナリ文字列にデータをパッケージ化するのに役立ちますが、 socket_sendto()は、UDPプロトコルを介して指定されたアドレスにデータを送信するために使用されます。この記事では、これら2つの機能を組み合わせて使用して、データのパッケージと送信を実現する方法について説明します。
Pack()関数は、指定された形式コードに基づいてPHP変数をバイナリ文字列に変換します。例えば:
$data = pack("Nn", 12345, 80);
ここで「nn」は次のことを意味します:
N :署名されていない長い整数(32ビット、ネットワークのエンディアンネス、つまりビッグエンディアンネス)
N :署名のない短い整数(16ビット、ネットワークエンディアン)
ネットワーク上で簡単に送信するために、整数12345と80をバイナリ文字列にパッケージ化します。
socket_sendto()は、主にUDPがデータを送信するために使用され、関数の署名は次のとおりです。
int socket_sendto(resource $socket, string $buf, int $len, int $flags, string $addr, int $port)
$ socket : socket_create()を介して作成されたソケットリソース
$ buf :送信されるデータ
$ len :送信されたデータの長さ
$フラグ:フラグ、通常0に設定されています
$ addr :宛先IPアドレス
$ポート:ターゲットポート
「メッセージID」と「ステータスコード」を含むパケットを送信する必要があり、メッセージIDは4バイト整数として使用され、ステータスコードは2バイト整数として使用されます。
<?php
// 作成する UDP Socket
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()));
}
// データを準備します:情報IDおよびステータスコード
$messageId = 1001; // 4 バイト整数
$statusCode = 200; // 2 バイト整数
// 使用 pack() 機能パッケージングデータ,ネットワークバイト順序(ビッグエンディアン)
$data = pack("Nn", $messageId, $statusCode);
// 宛先アドレスとポート
$ip = "m66.net";
$port = 12345;
// データを送信します
$sent = socket_sendto($socket, $data, strlen($data), 0, $ip, $port);
if ($sent === false) {
echo "socket_sendto() failed: " . socket_strerror(socket_last_error($socket));
} else {
echo "正常に送信されます {$sent} バイトデータへ {$ip}:{$port}\n";
}
// 閉鎖 socket
socket_close($socket);
?>
Pack()関数を介して、さまざまなタイプのデータをネットワークプロトコルの要件を満たすバイナリ形式に柔軟にエンコードできます。 socket_sendto()と組み合わせて、パッケージデータをUDPプロトコルを介して指定されたサーバーに送信して、効率的なネットワーク通信を実現できます。