【PHP8.x】stream_socket_recvfrom関数の使い方

作成日: 更新日:

stream_socket_recvfrom関数は、ネットワーク通信で使用されるソケットからデータを安全に読み込む機能を提供する関数です。この関数は、すでに接続が確立されたソケットからも、接続されていないソケットからもデータを受信することができます。特に、UDPなどのコネクションレスなプロトコルを用いた通信において、データを受信する際にその真価を発揮します。

この関数の大きな特徴は、データを受信すると同時に、そのデータを送信したリモートホストのアドレス情報を取得できる点です。これにより、サーバー側が複数のクライアントからのデータを受け取る際に、それぞれのデータがどのクライアントから送られてきたのかを正確に識別することが可能になります。関数には、読み込み対象となるソケットリソース、読み込みたい最大バイト数、オプションのフラグ、そして送信元アドレスを格納するための変数を渡します。

ネットワークアプリケーション、特に多数のクライアントと非同期に通信を行うサーバープログラムにおいて、クライアントからのリクエストデータと送信元を紐付ける必要がある場合に非常に役立ちます。データの読み込みに成功した場合は読み込んだデータ文字列を返し、エラーが発生した場合はブール値のfalseを返します。バイナリデータも安全に扱えるため、幅広いデータ形式の受信に対応しています。

基本的な使い方

構文(syntax)

<?php

// UDPサーバーソケットを作成
// 実際には、"udp://0.0.0.0:12345"のようにアドレスとポートを指定します
$socket = stream_socket_server("udp://127.0.0.1:12345");

if ($socket === false) {
    exit(1);
}

// 受信する最大バイト数
$length = 1024;

// フラグ (例: MSG_PEEKなど、通常は0)
$flags = 0;

// 送信元のアドレスが格納される変数 (参照渡し)
$remoteAddress = null;

// stream_socket_recvfrom 関数を呼び出し、ソケットからデータを受信
$receivedData = stream_socket_recvfrom(
    $socket,
    $length,
    $flags,
    $remoteAddress
);

if ($receivedData !== false) {
    // データが正常に受信された場合の処理
    // $receivedData には受信された文字列データが、
    // $remoteAddress には送信元のアドレスが格納されます。
    // 例: echo "Received: " . $receivedData . " from " . $remoteAddress . "\n";
} else {
    // データ受信に失敗した場合の処理
    // 例: echo "Failed to receive data.\n";
}

// ソケットを閉じる
fclose($socket);

?>

引数(parameters)

resource $socket, int $length, int $flags = 0, ?string &$address = null

  • resource $socket: 読み取り対象のソケットリソース
  • int $length: 読み取る最大バイト数
  • int $flags = 0: オプションフラグ
  • ?string &$address = null: 接続元のアドレス情報(出力用)

戻り値(return)

string|false

ストリームソケットから受信したデータを文字列で返します。データの受信に失敗した場合は false を返します。

【PHP8.x】stream_socket_recvfrom関数の使い方 | いっしー@Webエンジニア