インターネットドメインまたは Unix ドメインのソケット接続を開く

# stream_socket_client

(PHP 5, PHP 7, PHP 8)

stream_socket_client — インターネットドメインまたは Unix ドメインのソケット接続を開く

### 説明

function stream_socket_client(
string `$address`,
int `&$error_code` = `null`,
string `&$error_message` = `null`,
?float `$timeout` = `null`,
int `$flags` = `STREAM_CLIENT_CONNECT`,
?resource `$context` = `null`
): resource|false

`address` で指定された接続先との、 ストリームまたはデータグラム接続を確立します。 作成されるソケットのタイプは、`[トランスポート]://[ターゲット]` という形式の URL フォーマットによって指定された トランスポートによって決定されます。 TCP や UDP といったインターネットドメインのソケット (AF_INET) には、`address` パラメータの `ターゲット` の部分は、ホスト名または IP アドレスと、 それに続くコロンで区切られたポート番号から構成されていなければなりません。 Unix ドメインのソケットの場合は、`ターゲット` の部分は、ファイルシステムにおけるソケットのファイルを指定しなくては いけません。

> 注意:

> ストリームはデフォルトではブロックモードで開かれますが、 stream_set_blocking() を使うことで非ブロックモードに 変更することができます。

### パラメータ

`address`

  接続するソケットのアドレス。

`error_code`

  接続に失敗した場合にシステムレベルのエラー番号が設定されます。

`error_message`

  接続に失敗した場合にシステムレベルのエラーメッセージが設定されます。

`timeout`

  `connect()` システムコールがタイムアウトとなるまでの秒数。 デフォルトでは、 default_socket_timeout の値を使います。

  > 注意: このパラメータが適用されるのは、非同期通信を試みていない場合のみです。

  > 注意:

  > ソケット上のデータの読み書きに関してタイムアウトを設定する必要がある場合は、 stream_set_timeout() を使ってください。 stream_socket_client() に渡される `timeout` は、ソケットの接続時にのみ適用されます。

`flags`

  接続設定フラグの任意の組み合わせを指定できるビットフィールドです。 現在、接続設定フラグとして選択できる値は、 `STREAM_CLIENT_CONNECT`（デフォルト）、 `STREAM_CLIENT_ASYNC_CONNECT` と `STREAM_CLIENT_PERSISTENT` のみです。

`context`

  stream_context_create() で作成した有効なコンテキストリソース。

### 戻り値

成功した場合に、 fgets(), fgetss(), fwrite(), fclose(), feof() といった、ファイル関数と共に使うことのできるストリームリソースを返します。

### エラー / 例外

失敗した場合は、`error_code` と `error_message` に システムレベルの `connect()` 関数の実行時に発生したシステムレベルのエラーを表す値を返します。 もし、`error_code` に返された値が `0` で、かつ、 この関数が `false` を返した時は、 `connect()` システムコールの前に何らかのエラーが 発生したことを示しています。これは、多くの場合、ソケットの初期化 に失敗したことで起こります。`error_code` と `error_message` パラメータは常に参照渡しされることに 留意してください。

### 変更履歴

バージョン | 説明
--- | ---
8.0.0 | `timeout` と `context` は、nullable になりました。

### 例

例1 stream_socket_client() の例

    <?php
    $fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
        while (!feof($fp)) {
            echo fgets($fp, 1024);
        }
        fclose($fp);
    }
    ?>

例2 UDP 接続の使用

ローカルホスト上で動いている UDP サービスの "daytime" (ポート 13) で日時の情報を取得します。

    <?php
    $fp = stream_socket_client("udp://127.0.0.1:13", $errno, $errstr);
    if (!$fp) {
        echo "ERROR: $errno - $errstr<br />\n";
    } else {
        fwrite($fp, "\n");
        echo fread($fp, 26);
        fclose($fp);
    }
    ?>

### 注意

警告

UDP ソケットは、リモートホストに到達できなくても エラーを発生せず、開いているかような状態になることがありす。 このエラーは、実際にソケットに対して、読み込みや書き込み動作を 行ってみないと判断できません。原因としては、UDP が非接続型の プロトコルであることが挙げられます。つまり、実際にデータを 送受信する段階になるまで、OS の側では接続を確立しようとしないという ことです。

> 注意: 数値で IPv6 アドレスを指定するときは、 (例 `fe80::1`) アドレスを角カッコでくくらなくてはなりません。たとえば、 `tcp://[fe80::1]:80`.

> 注意:

> 環境により、Unix ドメインや接続タイムアウトが利用できない場合があります。 有効なトランスポートのリストは、stream_get_transports() で取得できます。組み込むのポートの一覧については、 サポートされるソケットトランスポートのリスト を参照ください。

### 参考

- stream_socket_server() - インターネットドメインまたは Unix ドメインのサーバーソケットを作成する
- stream_set_blocking() - ストリームのブロックモードを有効にする / 解除する
- stream_set_timeout() - ストリームにタイムアウトを設定する
- stream_select() - select() システムコールと同等の操作を、 ストリームの配列に対して seconds と microseconds で指定されたタイムアウト時間をもって行う
- fgets() - ファイルポインタから 1 行取得する
- fgetss() - ファイルポインタから 1 行取り出し、HTML タグを取り除く
- fwrite() - バイナリセーフなファイル書き込み処理
- fclose() - オープンされたファイルポインタをクローズする
- feof() - ファイルポインタがファイル終端に達しているかどうか調べる
- cURL 関数

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