ソケット（通信時の終端）を作成する

# socket_create

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

socket_create — ソケット（通信時の終端）を作成する

### 説明

function socket_create(int `$domain`, int `$type`, int `$protocol`): Socket|false

通信のエンドポイント(終端)と呼ばれることもある Socket クラスのインスタンスを作成し、 返します。典型的なネットワーク接続は、2つのソケットから成り立ちます。 このとき、片方はクライアント、もう片方はサーバーの役割をします。

### パラメータ

`domain`

  パラメータ `domain` には、 ソケットが利用するプロトコルファミリーを指定します。

  指定可能なアドレス/プロトコルファミリーの一覧
  ドメイン | 説明
  --- | ---
  `AF_INET` | IPv4 インターネットプロトコル。 このプロトコルファミリーに属するプロトコルとしてよく知られているのは、 TCP や UDP です。
  `AF_INET6` | IPv6 インターネットプロトコル。TCP と UDP が、このプロトコルファミリーで一般的なプロトコルです。
  `AF_UNIX` | ローカルでのコミュニケーションに用いられるプロトコルファミリーです。 高い効率と低いオーバーヘッドを誇るため、IPC (プロセス間通信) でよく使われます。

`type`

  `type` パラメータは、 ソケットが利用する通信方式を指定します。

  利用できるソケットのタイプ
  タイプ | 説明
  --- | ---
  `SOCK_STREAM` | このタイプでは、時系列的、高信頼性、全二重、接続型のバイトストリームが利用できます。 帯域外のデータ転送メカニズムがサポートされている場合もあります。 TCP プロトコルは、このソケットタイプに基づきます。
  `SOCK_DGRAM` | このタイプでは、データグラム(非接続型で、信頼性の高くない 固定バイト長のメッセージ) がサポートされます。 UDP プロトコルは、このソケットタイプに基づきます。
  `SOCK_SEQPACKET` | このタイプでは、時系列的な、信頼性のある、 双方向の接続指向型の固定長データグラム転送が利用できます。 パケットを消費する側は、一つのパケット全部を一度の read コールで読み込む必要があります。
  `SOCK_RAW` | このタイプでは、素のネットワークプロトコルを操作できます。 この特殊なソケットを使って、どのタイプのプロトコルでもユーザーの手で構築することができます。 よくある使い方として、(ping のような) ICMP リクエストの作成があります。
  `SOCK_RDM` | このタイプでは、信頼に足る、非時系列的なデータグラム転送が利用できます。 ほとんどのオペレーティングシステムでは実装されていないでしょう。

`protocol`

  `protocol` は、ソケット上の通信で使われる `domain` で指定されたファミリーに属するプロトコルを指定します。 正しい値は、getprotobyname() を使うことで取得できます。利用したいプロトコルが、TCP または UDP の場合は、定数 `SOL_TCP` と `SOL_UDP` を指定することもできます。

  一般的なプロトコルの一覧
  名称 | 説明
  --- | ---
  icmp | Internet Control Message Protocol は、主にゲートウェイやホストが、 データグラム通信におけるエラーを報告するのに使われます。 "ping" コマンド (最近のほとんどのオペレーティングシステムに 搭載されています) が ICMP アプリケーションの一例です。
  udp | User Datagram Protocol は、非接続指向の、信頼性の高くない、 固定のレコード長を用いるプロトコルです。このような側面のおかげで、 UDP はプロトコルとして最小限のオーバーヘッドしか要求しません。
  tcp | Transmission Control Protocol は、信頼性の高い、接続指向かつ ストリーム指向の全二重通信プロトコルです。TCP は、 すべてのパケットが、送信された順序で(時系列的に)受信されることを 保証します。もし、何らかの理由でパケットが通信中に失われた場合、 TCP では、送信先から通知があるまで、パケットが再送信されるように なっています。信頼性とパフォーマンス上の理由から、TCP の実装は、 下層にあるデータグラム通信レイヤーのオクテット幅を 適当な長さに決定します。このため、TCP アプリケーションは、 レコードの全部が一度に転送されない場合も考慮しなければなりません。

### 戻り値

socket_create() は、 成功時に Socket クラスのインスタンス、 失敗時に `false` を返します。 実際のエラーコードは、socket_last_error() を コールすることにより取得できます。このエラーコードをさらに socket_strerror()に渡すことにより、 エラーの内容を文字列で取得することが可能です。

### エラー / 例外

`domain` や `type` に 不正な値が与えられた場合、socket_create() は、これらを それぞれ `AF_INET` と `SOCK_STREAM` であるとみなし、`E_WARNING` メッセージを出します。

### 変更履歴

バージョン | 説明
--- | ---
8.5.0 | `AF_PACKET` ファミリーのソケットの作成をサポートするようになりました。
8.0.0 | 成功した場合に、この関数は Socket クラスのインスタンスを返すようになりました。 これより前のバージョンでは、リソースを返していました。

### 参考

- socket_accept() - ソケットへの接続を許可する
- socket_bind() - ソケットに名前をバインドする
- socket_connect() - ソケット上の接続を初期化する
- socket_listen() - ソケット上で接続待ち(listen)する
- socket_last_error() - ソケットの直近のエラーを返す
- socket_strerror() - ソケットエラーの内容を文字列として返す

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