PHPでは、 socket_recvmsgとsocket_cmsg_space関数は通常、基礎となるソケット通信を処理するために使用されます。ネットワークに関連するメッセージを処理する必要がある場合、メッセージヘッダー、データ、および関連する制御情報を処理する必要があることがよくあります。 socket_recvmsg関数を使用してデータを受信し、メッセージバッファーに保存でき、制御情報のスペースサイズはsocket_cmsg_spaceを介して計算できます。この記事では、これら2つの関数を組み合わせてメッセージ空間を効果的に計算する方法について詳しく説明します。
socket_recvmsg関数は、ネットワークメッセージを受信するためのPHPの基礎となるソケット関数です。データを受信するだけでなく、メッセージに関連するプロセス制御情報も受信できます。その関数プロトタイプは次のとおりです。
socket_recvmsg($socket, $message, $flags);
$ソケット:データを受信する必要があるソケット。
$メッセージ:保存したデータを受け取った配列で、通常はデータのバッファーを含みます。
$フラグ:通常は整数値であるデータを受信するフラグは、 msg_peekなどの異なるフラグに設定できます。
socket_cmsg_space関数は、メッセージを受信するときに必要なスペースを計算するために使用されます。これは通常、制御情報のサイズを計算するために使用され、受信したメッセージに十分なスペースを割り当てることが保証されます。プロトタイプは次のとおりです。
socket_cmsg_space($level, $type);
$レベル:メッセージ制御レベル、通常はsol_socketなどのプロトコルレベルで。
$タイプ: so_rcvbufなどのメッセージのタイプを制御します。
これら2つの機能を組み合わせて使用する場合、まずsocket_cmsg_spaceを使用して、予想されるコントロールメッセージスペースを計算する必要があります。次に、 socket_recvmsgを介してデータを受信し、データを保存して情報を制御するのに十分なメモリが割り当てられていることを確認できます。
<?php
// ソケットを作成します
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
// バインドポート
socket_bind($socket, '0.0.0.0', 12345);
// メッセージの制御情報を計算するために必要なスペース
$level = SOL_SOCKET;
$type = SO_RCVBUF;
$control_space = socket_cmsg_space($level, $type);
// メッセージを受信するために必要なバッファ容量を計算します
$buffer_size = 1024 + $control_space;
// メッセージバッファを作成します
$message = socket_cmsg_space($level, $type);
$buffer = str_repeat("\0", $buffer_size);
// 使用 socket_recvmsg データを受信します
$bytes_received = socket_recvmsg($socket, $message, 0);
// 受信したデータを処理します
if ($bytes_received !== false) {
echo "受け取った $bytes_received バイトデータ: " . bin2hex($message) . PHP_EOL;
} else {
echo "データを受信します失败: " . socket_strerror(socket_last_error($socket)) . PHP_EOL;
}
// ソケットを閉じます
socket_close($socket);
?>
上記の例では、最初にUDPソケットを作成し、ポートにバインドします。次に、 socket_cmsg_space関数を使用して、制御情報を受信するために必要なスペースを計算し、この空間に基づいてバッファサイズの合計サイズを計算します。最後に、 socket_recvmsg関数を使用してデータを受信し、 $メッセージ変数に保存します。
socket_recvmsgとsocket_cmsg_space関数を組み合わせることにより、ネットワークデータを受信するときにデータを保存して情報を制御するのに十分なスペースがあることを確認できます。 socket_cmsg_space関数は、制御情報に割り当てる必要があるスペースを計算するのに役立つため、特に便利です。一方、 socket_recvmsgは実際のメッセージ受信に使用されます。これらの2つの機能は、基礎となるネットワーク通信をより柔軟かつ効果的に管理できるようにするために組み合わせることができます。
基礎となるソケット通信に対してより高い要求がある場合、これらの2つの機能がメッセージをよりよく受信および処理するのに役立つ方法を理解してください。