接続したソケットからデータを受信する

# socket_recv

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

socket_recv — 接続したソケットからデータを受信する

### 説明

function socket_recv(
Socket `$socket`,
?string `&$data`,
int `$length`,
int `$flags`
): int|false

socket_recv() 関数は、 `socket` から `length` バイトのデータを受信して `data` に格納します。 socket_recv() を使うと、 接続したソケットからデータを収集することができます。 さらに、フラグを指定して関数の挙動を変更することもできます。

`data` は参照渡しなので、 引数リストには変数で渡さなければなりません。 `socket` から socket_recv() で読み込んだデータが `data` に入ります。

### パラメータ

`socket`

  `socket` は、事前に socket_create() で作成した Socket クラスのインスタンスでなければなりません。

`data`

  受信したデータが、 `data` で指定した変数に格納されます。 エラーが発生したり接続がリセットされたりデータが存在しなかったりした場合は、 `data` には `null` が設定されます。

`length`

  最大 `length` バイトまでをリモートホストから取得します。

`flags`

  `flags` の値は、次のフラグを論理 OR (`|`) 演算子で組み合わせたものとなります。

  `flags` のとりうる値
  フラグ | 説明
  --- | ---
  `MSG_OOB` | out-of-band を処理します。
  `MSG_PEEK` | 受信キューの先頭からデータを取得し、受信したデータをキューから削除しません。
  `MSG_WAITALL` | 最低 `length` バイト受信するまでブロックします。 しかし、シグナルを受け取ったりリモートホストが接続を切断したりした場合は、 この関数が返すデータがそれより少なくなる可能性があります。
  `MSG_DONTWAIT` | このフラグを設定すると、正常にブロックされている状態でも関数が結果を返します。

### 戻り値

socket_recv() は、受信したバイト数を返します。 エラーが発生した場合は `false` を返します。 実際のエラーコードを取得するには socket_last_error() をコールします。 このエラーコードを socket_strerror() に渡すと、エラーに関する説明テキストを取得することができます。

### 変更履歴

バージョン | 説明
--- | ---
8.0.0 | `socket` は、Socket クラスのインスタンスになりました。 これより前のバージョンでは、リソース型でした。

### 例

例1 socket_recv() の例

この例は、 例 の最初の例を書き換えて socket_recv() を使う形式にしたものです。

    <?php
    error_reporting(E_ALL);

    echo "<h2>TCP/IP Connection</h2>\n";

    /* WWW サービスのポートを取得します */
    $service_port = getservbyname('www', 'tcp');

    /* 対象となるホストの IP アドレスを取得します */
    $address = gethostbyname('www.example.com');

    /* TCP/IP ソケットを作成します */
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
        echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
    } else {
        echo "OK.\n";
    }

    echo "Attempting to connect to '$address' on port '$service_port'...";
    $result = socket_connect($socket, $address, $service_port);
    if ($result === false) {
        echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
    } else {
        echo "OK.\n";
    }

    $in = "HEAD / HTTP/1.1\r\n";
    $in .= "Host: www.example.com\r\n";
    $in .= "Connection: Close\r\n\r\n";
    $out = '';

    echo "Sending HTTP HEAD request...";
    socket_write($socket, $in, strlen($in));
    echo "OK.\n";

    echo "Reading response:\n\n";
    $buf = 'This is my buffer.';
    if (false !== ($bytes = socket_recv($socket, $buf, 2048, MSG_WAITALL))) {
        echo "Read $bytes bytes from socket_recv(). Closing socket...";
    } else {
        echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n";
    }
    socket_close($socket);

    echo $buf . "\n";
    echo "OK.\n\n";
    ?>

上の例の出力は、 たとえば以下のようになります。

    <h2>TCP/IP Connection</h2>
    OK.
    Attempting to connect to '208.77.188.166' on port '80'...OK.
    Sending HTTP HEAD request...OK.
    Reading response:

    Read 123 bytes from socket_recv(). Closing socket...HTTP/1.1 200 OK
    Date: Mon, 14 Sep 2009 08:56:36 GMT
    Server: Apache/2.2.3 (Red Hat)
    Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT
    ETag: "b80f4-1b6-80bfd280"
    Accept-Ranges: bytes
    Content-Length: 438
    Connection: close
    Content-Type: text/html; charset=UTF-8

    OK.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open