現在の位置: ホーム> 最新記事一覧> Pack()関数とsocket_sendto()を使用して、データパッケージと送信を実現する方法は?

Pack()関数とsocket_sendto()を使用して、データパッケージと送信を実現する方法は?

M66 2025-06-23

ネットワークプログラミングでは、データ送信はプロトコル形式に厳密に従って、送信および受信先がデータを正しく解析できるようにする必要があります。 PHPのpack()関数は、指定された形式のバイナリ文字列にデータをパッケージ化するのに役立ちますが、 socket_sendto()は、UDPプロトコルを介して指定されたアドレスにデータを送信するために使用されます。この記事では、これら2つの機能を組み合わせて使用​​して、データのパッケージと送信を実現する方法について説明します。

1。Pack ()関数の紹介

Pack()関数は、指定された形式コードに基づいてPHP変数をバイナリ文字列に変換します。例えば:

 $data = pack("Nn", 12345, 80);

ここで「nn」は次のことを意味します:

  • N :署名されていない長い整数(32ビット、ネットワークのエンディアンネス、つまりビッグエンディアンネス)

  • N :署名のない短い整数(16ビット、ネットワークエンディアン)

ネットワーク上で簡単に送信するために、整数1234580をバイナリ文字列にパッケージ化します。

2。socket_sendto ()関数の紹介

socket_sendto()は、主にUDPがデータを送信するために使用され、関数の署名は次のとおりです。

 int socket_sendto(resource $socket, string $buf, int $len, int $flags, string $addr, int $port)
  • $ socketsocket_create()を介して作成されたソケットリソース

  • $ buf :送信されるデータ

  • $ len :送信されたデータの長さ

  • $フラグ:フラグ、通常0に設定されています

  • $ addr :宛先IPアドレス

  • $ポート:ターゲットポート

3.サンプルコード: pack()socket_sendto()と組み合わせてデータを送信します

「メッセージ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);
?>

4。概要

Pack()関数を介して、さまざまなタイプのデータをネットワークプロトコルの要件を満たすバイナリ形式に柔軟にエンコードできます。 socket_sendto()と組み合わせて、パッケージデータをUDPプロトコルを介して指定されたサーバーに送信して、効率的なネットワーク通信を実現できます。